- •Содержание
- •Введение
- •Постановка задачи
- •Теоретическое исследование
- •Представление изображений в эвм. Форматы изображений
- •Общие положения о защите авторского права и водяных знаках
- •Методы внедрения водяных знаков в изображения
- •Метод микширования
- •Метод нанесения текста
- •Метод lsb
- •Метод Patchwork
- •Обзор существующих программ-аналогов
- •Tsr Watermark Image 1.9.6.4
- •ImageSpyer 1.1
- •Разработка схемы алгоритма и её описание
- •Общая схема работы программы
- •Описание работы класса wmParameters
- •Описание работы класса TextParameters
- •Описание работы класса lsbInjector
- •Описание работы класса PatchworkInjector
- •Разработка программы
- •Тестирование и отладка
- •Руководство пользователя
- •Описание менюFile
- •Описание интерфейса метода микширования
- •Описание интерфейса метода нанесения текста
- •Описание интерфейса методовLsBиPatchwork
- •Заключение
- •Список использованных источников
- •Приложение а. Диаграмма классов приложения watermark injector
- •Приложение б. Исходный текст классаmainform
- •Приложение в. Исходный текст класса wmparameters
- •Приложение г. Исходный текст класса textparameters
- •Приложение д. Исходный текст классаlsbinjector
- •Приложение д. Исходный текст классаpatchworkinjector
Приложение д. Исходный текст классаlsbinjector
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
namespace WatermarkInjector
{
class LSBInjector
{
private Bitmap bmp;
private string srcfile;
private int LSBnum;
public LSBInjector(Bitmap bmpInj,string filename,int q)
{
bmp = bmpInj;
srcfile = filename;
LSBnum = q;
}
private byte LSBModify(byte num,bool b)
{
return (byte)((b) ? ((num % 2 == 0) ? num + 1 : num) : ((num % 2 != 0) ? num - 1 : num));
}
private bool GetValue(byte num)
{
byte[] bt = new byte[1];
bt[0] = num;
BitArray BA = new BitArray(bt);
return (BA.Get(0));
}
public Bitmap Inject()
{
Color c,c1;
int v = (3 * LSBnum * bmp.Width * bmp.Height) / 8 + 1;
FileStream fs = new FileStream(srcfile, FileMode.Open);
long stegoVolume = (v < fs.Length) ? v : fs.Length;
BinaryReader br = new BinaryReader(fs);
byte[] forInj = br.ReadBytes((int)stegoVolume); //это и будем внедрять
BitArray ba = new BitArray(forInj);
int k = 0;
for (int i = 0; i <= bmp.Width - 1; i++)
for (int j = 0; j <= bmp.Height - 1; j++)
{
c = bmp.GetPixel(i, j);
if (k <= ba.Length - 3)
{
c1 = Color.FromArgb((int)LSBModify((byte)c.R,ba[k]),(int)LSBModify((byte)c.G,ba[k+1]),(int)LSBModify((byte)c.B,ba[k+2]));
}
else
c1 = c;
bmp.SetPixel(i, j, c1);
k += 3;
}
br.Close();
fs.Close();
return (Bitmap)bmp.Clone();
}
public bool Assure()
{
Color c;
int v = (3 * LSBnum * bmp.Width * bmp.Height) / 8 + 1;
FileStream fs = new FileStream(srcfile, FileMode.Open);
long stegoVolume = (v < fs.Length) ? v : fs.Length;
BinaryReader br = new BinaryReader(fs);
byte[] forInj = br.ReadBytes((int)stegoVolume); //это и будем внедрять
BitArray ba = new BitArray(forInj);
BitArray check = new BitArray(forInj.Length*8);
int k = 0;
for (int i = 0; i <= bmp.Width - 1; i++)
for (int j = 0; j <= bmp.Height - 1; j++)
{
c = bmp.GetPixel(i, j);
if (k <= check.Length - 3)
{
check.Set(k, GetValue(c.R));
check.Set(k + 1, GetValue(c.G));
check.Set(k + 2, GetValue(c.B));
}
k += 3;
}
int num_err = 0;
for (int i = 0; i <= check.Length - 1; i++)
{
if (check.Get(i) != ba.Get(i))
num_err++;
}
br.Close();
fs.Close();
if (((float)num_err / (float)(ba.Length) >= 0.4) && ((float)num_err / (float)(ba.Length)<=0.6))
MessageBox.Show("For compressed format watermark assurance cannot be processed");
return (float)num_err / (float)(ba.Length) <= 0.1;
}
}
}