Torna al Thread
//Ottiene i bytes di un'immagine
array<Byte> ^GetBytesFromBitmap(Bitmap ^bmp)
{
array<Byte> ^result = gcnew array<Byte>(bmp->Width * bmp->Height * 4);
int index = 0;
for(int x = 0; x < bmp->Width; x++)
{
for(int y = 0; y < bmp->Height; y++)
{
array<Byte> ^tmp = BitConverter::GetBytes(bmp->GetPixel(x, y).ToArgb());
tmp->CopyTo(result, index);
index += 4;
}
}
return result;
}
//Imposta i bytes di un'immagine
//Ritorna il numero di bytes letti
int SetBitmapBytes(Bitmap ^bmp, array<Byte> ^bytes)
{
int index = 0;
for(int x = 0; x < bmp->Width; x++)
{
for(int y = 0; y < bmp->Height; y++)
{
Color color = Color::FromArgb(BitConverter::ToInt32(bytes, index));
bmp->SetPixel(x, y, color);
index += 4;
}
}
return index;
}
//Codifica un'immagine. additiveBytes, passato per riferimento, alla fine contiene
//i bytes aggiuntivi ottenuti dalla codifica, che servono per una successiva corretta decodifica
Bitmap ^Encode(Image ^imgToEncode, System::Security::Cryptography::Rijndael ^rijndael, array<Byte> ^%additiveBytes)
{
//Creo l'immagine da crittare
Bitmap ^crypted = gcnew Bitmap(imgToEncode->Width, imgToEncode->Height, System::Drawing::Imaging::PixelFormat::Format32bppArgb);
//Ottengo i bytes dell'immagine da crittare
array<Byte> ^bytes = GetBytesFromBitmap((Bitmap^)imgToEncode);
//Ottengo i bytes crittati
array<Byte> ^cryptedBytes = rijndael->CreateEncryptor()->TransformFinalBlock(bytes, 0, bytes->Length);
//Imposti i bytes dell'immagine cittata e ottieni il numero di bytes letti
int readBytes = SetBitmapBytes(crypted, cryptedBytes);
//imposta i bytes aggiuntivi ottenuti dalla codifica con rijndael
additiveBytes = gcnew array<Byte>(cryptedBytes->Length - readBytes);
Array::Copy(cryptedBytes, readBytes, additiveBytes, 0, additiveBytes->Length);
//Ritorna l'immagine
return crypted;
}
//Decodifica un'immagine. additiveBytes deve essere l'array di bytes ottenuto dalla codifica
//con Encode
Bitmap ^Decode(Image ^imgToDecode, System::Security::Cryptography::Rijndael ^rijndael, array<Byte> ^additiveBytes)
{
//Crea l'immagine da decrittare
Bitmap ^decrypted = gcnew Bitmap(imgToDecode->Width, imgToDecode->Height, System::Drawing::Imaging::PixelFormat::Format32bppArgb);
//Ottiene i bytes da decrittare
array<Byte> ^bytes = GetBytesFromBitmap((Bitmap^)imgToDecode);
int len = bytes->Length;
//Aggiunge i bytes aggiuntivi ottenuti da una precedente codifica
Array::Resize(bytes, bytes->Length + additiveBytes->Length);
additiveBytes->CopyTo(bytes, len);
//decritta i bytes
array<Byte> ^decryptedBytes = rijndael->CreateDecryptor()->TransformFinalBlock(bytes, 0, bytes->Length);
//imposta i bytes dell'immagine
SetBitmapBytes(decrypted, decryptedBytes);
//Ritorna l'immagine
return decrypted;
}