我正在使用BinaryReader读取图像的字节,我在尝试使用BinaryReader读取位图图像的ARGB值时遇到了一些问题。任何人都可以建议一种方法,我可以得到位图图像中每个像素的字节值?
提前致谢
答案 0 :(得分:1)
简单的方法是使用不安全的上下文并锁定一些位。过度简化的样本:
unsafe
{
var bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
byte* first = (byte*)bitmapData.Scan0;
byte a = first[0];
byte r = first[1];
byte g = first[2];
byte b = first[3];
...
bmp.UnlockBits(bitmapData);
}
但是,如果您仍然需要使用BinaryReader,并且您知道每个像素有多少字节,则可以跳过标题(您可以在@Bradley_Ufffner的链接中找到它的长度)并访问字节。 / p>
答案 1 :(得分:0)
您需要学习此处提供的BMP文件格式:http://en.wikipedia.org/wiki/BMP_file_format 正确读取文件将涉及从头部中找出像素格式并基于此正确解析数据。该文件可能是palatalized,在这种情况下,您需要读出颜色表数据并使用它将像素映射到实际颜色。像素数据也可能被压缩,必须根据标题中的值进行提取。
这不是一个简单的项目,像这样的东西是图形库被发明的原因。
答案 2 :(得分:0)
如果您需要使用BinaryReader读取位图的像素数据,请尝试UnmanagedMemoryStream:
Bitmap bmp = new Bitmap("img.bmp");
var bits = bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
try{
unsafe{
using(Stream bmpstream = new UnmanagedMemoryStream((byte*)bits.Scan0, bits.Height*bits.Stride))
{
BinaryReader reader = new BinaryReader(bmpstream);
for(int y = 0; y < bits.Height; y++)
{
bmpstream.Seek(bits.Stride*y, SeekOrigin.Begin);
for(int x = 0; x < bits.Width; x++)
{
byte b = reader.ReadByte();
byte g = reader.ReadByte();
byte r = reader.ReadByte();
byte a = reader.ReadByte();
}
}
}
}
}finally{
bmp.UnlockBits(bits);
}