迭代位图的行和列
本文关键字:位图 迭代 | 更新日期: 2023-09-27 17:58:15
我知道这可能很容易,但我找不到解决方案。
使用当前位图的所有位图后,我需要获得下一行位图我正在制作一个速记程序,在图像中隐藏一个文本文件。每个字符存储在8个不同的字节中。所以在将文本隐藏在第一列之后,我需要获取下一列,依此类推。我在这方面很软弱。我在第一行尝试了这个,但根据文本长度不知道其他行。
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
}
}
}
}}
这个怎么样?
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
}
}
}}
例如,如果您的宽度为10,则这些应该是文本的前两个字母的坐标:
字母1:
(0,0)
(0,7)
字母2:
(0,8)
(0,9)
(1,0)
重要提示:看起来您没有隐藏文本的长度,解码过程也不知道要读取多少像素才能检索消息。
如果你在其他地方处理过,或者解码器总是知道长度,那没关系。否则,您需要在固定位置使用一定数量的像素(通常是前32个),以二进制形式编码文本的长度。例如,
int secretLength = 8 * textBox1.Text.Length;
string binary = Convert.ToString(secretLength, 2);
对于文本"Hello World",二进制值将为0000000000000000011000。现在,您可以将这些嵌入到您的32个特定像素中,然后再嵌入实际的秘密消息中。请记住,在这种情况下,您的图像必须至少有8 * TextBox1.Text.Length + 32
数量的像素才能容纳整个秘密。
考虑到图像大小的限制,使用4个字节作为文本长度是一种过分的做法。如果你总是能保证文本大小永远不会超过特定的长度,或者更动态的方法,比如这个,你可以使用更少的字节
引用:从这里借用的整数到二进制字符串的转换。