Скачиваний:
184
Добавлен:
15.06.2014
Размер:
6.5 Mб
Скачать

Приложение д. Исходный текст класса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;

}

}

}