C#关于数组的内容读取问题

ahmatjan0708 2009-04-17 07:53:50
各位高手帮助一下吧
我把24位真彩色bmp图片,用readbyte()函数一个字节一个字节的读取了BMP图片的所有内容(16进制),把它存放到一个数组里面,我在另一个picturebox中一个点一个点的打出来,我在这一过程中遇到了这样的一个问题,33X43像素的一个bmp图片内容读取到数组之后,从数据区开始在另一个picturebox中一个点一个点的打出来,打出来的图像变质了,原因在这一个图片中的红色小方格里面的内容是多余的,
long jixian = pic1.Image.Width * pic1.Image.Height * 3 + dataarea -1 + pic1.Image.Height;
Bitmap bmp = new Bitmap(pic1.Image.Width, pic1.Image.Height);

long[] data = new long[pic1.Image.Width * pic1.Image.Height * 3 + dataarea + pic1.Image.Height];
{
for (int a1 = dataarea; a1 < pic1.Image.Width * pic1.Image.Height * 3 + dataarea + pic1.Image.Height; a1++)
data [a1] = aa.ReadByte();
}

for (int y = 0; pic1.Image.Height > y; y++)
{
for (int x = pic1.Image.Width - 1; x >= 0; x--)

if (dataarea <jixian)
{
bmp.SetPixel(x, y, Color.FromArgb(Convert.ToInt32(data[jixian - 1]), Convert.ToInt32(data[jixian - 2]), Convert.ToInt32(data[jixian - 3])));
jixian = jixian - 3;
}
else
{

}
}
pic2.Image = bmp;

}
else
{
MessageBox.Show("这个不是BMP图片");
}

用for循环显示数组内容的时候怎么跳过“00”然后继续显示后面的内容,这个33X43的图片中有每33个像素(一个像素是RGB颜色组成的三个字节内容)之后有“00”(16进制)一个字节多余的内容,我现在怎么判断?遇到“00”的时候怎么跳过?
...全文
454 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingleilei 2009-04-22
  • 打赏
  • 举报
回复
肯定是读取的时候有问题啦
Tensionli 2009-04-22
  • 打赏
  • 举报
回复
学习
shenmixiaozi 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyi8808 的回复:]
如果知道是00,直接判断一下跳过好了。
[/Quote]

同意
whyabc 2009-04-22
  • 打赏
  • 举报
回复
up
lfywy 2009-04-22
  • 打赏
  • 举报
回复
学习
yagebu1983 2009-04-19
  • 打赏
  • 举报
回复
学习六楼的方法。。。
up。。。
readfuture 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ahmatjan0708 的回复:]
跳过我也是知道的,但是怎么判断循环到了“00”,怎么跳过“00”,还在继续循环?
[/Quote]
break;
fanbo 2009-04-19
  • 打赏
  • 举报
回复
智能帮你顶了。
小曦子 2009-04-19
  • 打赏
  • 举报
回复
学习一下
llsen 2009-04-19
  • 打赏
  • 举报
回复
Up
Myth_NiuNiu 2009-04-19
  • 打赏
  • 举报
回复
帮顶
zhoujk 2009-04-19
  • 打赏
  • 举报
回复
去下一个我的资源
uncleson88 2009-04-18
  • 打赏
  • 举报
回复
顶一下6楼的,你把图片裁剪成32的再试试?
zzxap 2009-04-18
  • 打赏
  • 举报
回复
读取数据有问题,
xushichang 2009-04-18
  • 打赏
  • 举报
回复
帮顶
gomoku 2009-04-18
  • 打赏
  • 举报
回复
1楼和2楼的朋友在跟你开玩笑呢:)

BMP文件的格式大致如此:

--------------------------------------------------------文件头
'B''M' 2字节(固定为BM)
size 4字节(文件的长度,单位byte)
保留 4字节
偏移 4字节 (到位图数据的偏移,单位byte)
--------------------------------------------------------图像信息
图像信息头 40字节(sizeof(BITMAPINFOHEADER))
调色板 不固定
--------------------------------------------------------位图数据
........
........
--------------------------------------------------------


位图数据部分很重要的一点是每行的数据要对齐(原文: each scan line must be padded with zeroes to end on a LONG data-type boundary)。
注:对齐的原因是为了优化操作。

你用的是24bit的图像,每行33个像素,每像素3个字节。一行共99个字节,显然是不能以4个字节为单位进行对齐,要补零到4的倍数,也就是100。
这就是为什么你看到一个字节的多余数据。

每行,也有人叫每个扫描线,的步长,英文叫Stride,可以通过BitmapData.Stride来获得。
存取操作一般不用(图像宽度*字节每像素*第几行 + ...),而要用(Stride * 第几行 + ...)来进行。

要拿到图像数据,比较简单的是用Bitmap.LockBits()来得到一个BitmapData
你要用ReadBytes也可以。这时可利用“图像信息头”得到图像的大小,色深等信息;利用“偏移”直接跳得图像数据部分;
根据宽度和色深计算出“步长”;然后就可以自己读Bmp文件数据了。

陌上花花 2009-04-17
  • 打赏
  • 举报
回复
帮顶
ahmatjan0708 2009-04-17
  • 打赏
  • 举报
回复
跳过我也是知道的,但是怎么判断循环到了“00”,怎么跳过“00”,还在继续循环?
ws_hgo 2009-04-17
  • 打赏
  • 举报
回复
关注...
我姓区不姓区 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyi8808 的回复:]
如果知道是00,直接判断一下跳过好了。
[/Quote]
就是啊,既然你都知道了,跳过不就好了
加载更多回复(1)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧