Iterar as linhas e colunas do bitmap
-
21-12-2019 - |
Pergunta
eu sei que pode ser fácil, mas não consegui encontrar uma solução para isso.
Preciso obter a próxima linha do bitmap depois de usar todo o bitmap do bitmap atual, estou fazendo um programa de estenografia onde estou escondendo um arquivo de texto dentro da imagem.Cada caractere é armazenado em 8 bytes diferentes.então, depois de ocultar o texto dentro da primeira coluna, preciso obter a próxima coluna e assim por diante.Sou muito fraco nisso.Tentei isso para a primeira linha, mas não sei para outras linhas de acordo com o comprimento do texto.
private void HIDE(){
if (textBox1.Text != "")
{
Bitmap bitmap = (Bitmap)pictureBox1.Image;
int next,width=0;
for (int t = 0; t < textBox1.Text.Length; t++)
{
next = 8 * t;
for (int i = 0; i < 8; i++)
{
if (i * t <= bitmap.Width/8)
{
//hiding code for 1st row
}
else
{
//hiding code for 2nd row
}
}
}
}}
Solução
Que tal agora?
private void HIDE(){
if (textBox1.Text != "")
{
Bitmap bitmap = (Bitmap)pictureBox1.Image;
// Starting point for embedding secret
int x0=0, y0=0;
// Error checking, to see if text can fit in image
int imageSize = bitmap.Width * bitmap.Height;
if (imageSize - x0 * bitmap.Width - y0 < 8 * textBox1.Text.Length)
{
// Deal with error
}
// Ready to embed
for (int t = 0; t < textBox1.Text.Length; t++)
{
for (int i = 0; i < 8; i++)
{
// Check if y0 has exceeded image width
// so to wrap around to the new row
if (y0 == bitmap.Width)
{
x0++;
y0=0;
}
// x0, y0 are now the current pixel coordinates
//
// EMBED MESSAGE HERE
//
y0++; // Move to the next pixel for the next bit
}
}
}}
Por exemplo, se você tiver uma largura de 10, estas deverão ser as coordenadas das duas primeiras letras do seu texto:
Carta 1:
(0, 0)
...
(0, 7)
Carta 2:
(0, 8)
(0, 9)
(1, 0)
...
NOTA IMPORTANTE:Parece que você não esconde o comprimento do texto e o processo de decodificação não saberá quantos pixels ler para recuperar a mensagem.
Se você já lidou com isso em outro lugar, ou se o decodificador sempre sabe a duração, tudo bem.Caso contrário, você deseja usar um determinado número de pixels em um local fixo (geralmente os primeiros 32) para codificar em binário o comprimento do seu texto.Por exemplo,
int secretLength = 8 * textBox1.Text.Length;
string binary = Convert.ToString(secretLength, 2);
Para o texto "Hello World", o binário será 0000000000000000000000001011000.Agora você pode incorporá-los em seus 32 pixels específicos e depois na mensagem secreta real.Lembre-se que neste caso sua imagem deve ter pelo menos 8 * TextBox1.Text.Length + 32
número de pixels para acomodar todo o segredo.
Usar 4 bytes para o comprimento do texto é um exagero, considerando, acima de tudo, as limitações de tamanho da imagem.Você pode usar menos bytes se sempre puder garantir que o tamanho do texto nunca excederá um comprimento específico ou uma abordagem mais dinâmica, como esse
Referência:Conversão de string inteira para binária emprestada de aqui.