من المعروف ان كل Pixel يتكون من ثلاثة الوان أساسية Red,Green,Blue
وكل لون عبارة عن 1 byte
// read 1 pixel and get the RGB that it consits from Color c = myBitmap.GetPixel(i, j); byte R = c.R; byte G = c.G; byte B = c.B;
ما نريد عمله هو أن نحول ال Text التي نريد أخفاءها الى مجموعة من ال bits
ووضع كل bit من هذه ال Text في ال bit الأولى من ال R وال G وال B
كما هو موضح في الصورة التالية :

طبعا هذه العملية ستؤدي إلى تغيير الالوان التي تتكون منها الصورة ... ولكن لا يمكن للعين المجردة ان تلاحظ الفرق.
ملاحظة:
عندما نريد استرجاع ال Text من الصورة ... ستواجههنا مشكلة وهي:
متى نتوقف؟!!
لذلك سوف نضع ال Size لل Text المراد اخفاؤها في أول Pixel من الصورة
لذلك سوف أقوم بوضع ال size في ال R دون التأثير على ال G وال B
Color c = GetPixel(0, 0); byte R = (byte)MyStream.Length; // the size of my Text in bytes byte G = c.G; // no change byte B = c.B; // no change b.SetPixel(0, 0, Color.FromArgb(R, G, B));
الآن نقوم بقراءة ال Pixels من الصورة بعدد الbits المراد اخفاؤها مقسوما على 3
==> لأنه في كل Pixel سوف نخفي 3 bits
من أهم ال Functions التي سوف نحتاجها :
//byte[] eMyStringBytes => my text after converting it to an array of bytes
//int index => in which byte i am
//int ePosition => in which bit i am
private bool GetBitFromMyString()
{
byte b = eMyStringBytes[eIndex];
bool myBit = (b & (byte)(1 << ePosition)) != 0;
ePosition--;
if (ePosition < 0)
{
ePosition = 7;
eIndex++;
}
return myBit;
}ملاحظة :
نخزن ال bit في متغير من نوع boolean
converting myText to array of bytes : eMyStringBytes = Encoding.ASCII.GetBytes(myText);
//for storing bit in the "first bit" of a byte:
private byte SetBitEnc(byte b, bool newBitValue)
{
byte mask = (byte)(1);
if (newBitValue)
{
return (byte)(b | mask);
}
else
{
return (byte)(b & ~mask);
}
}في المرفقات مثال وهذه صورة عنه :
Encryption :
Decryption :

