C#使用BinaryReader读取位图图像的颜色字节值

C#使用BinaryReader读取位图图像的颜色字节值,c#,bitmap,binaryreader,C#,Bitmap,Binaryreader,我使用BinaryReader读取图像的字节,尝试使用BinaryReader读取位图图像的ARGB值时遇到一些问题。有人能建议一种方法,我可以得到位图图像中每个像素的字节值吗 提前感谢您需要学习此处提供的BMP文件格式: 正确读取文件需要从标题中找出像素格式,并在此基础上正确解析数据。该文件可能会被美化,在这种情况下,您需要读取颜色表数据并使用它将像素映射到实际颜色。像素数据也可以被压缩,并且必须基于报头中的值来提取 这将不是一个简单的项目,像这样的事情是图形库被发明的原因。简单的方法是使用不

我使用BinaryReader读取图像的字节,尝试使用BinaryReader读取位图图像的ARGB值时遇到一些问题。有人能建议一种方法,我可以得到位图图像中每个像素的字节值吗


提前感谢

您需要学习此处提供的BMP文件格式: 正确读取文件需要从标题中找出像素格式,并在此基础上正确解析数据。该文件可能会被美化,在这种情况下,您需要读取颜色表数据并使用它将像素映射到实际颜色。像素数据也可以被压缩,并且必须基于报头中的值来提取


这将不是一个简单的项目,像这样的事情是图形库被发明的原因。

简单的方法是使用不安全的上下文并锁定一些位。过于简化的样本:

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的链接中找到其长度)并访问字节。

如果您需要使用BinaryReader读取位图的像素数据,请尝试:

Bitmap bmp=新位图(“img.bmp”);
var bits=bmp.LockBits(新矩形(0,0,bmp.Width,bmp.Height)、ImageLockMode.ReadOnly、PixelFormat.Format32bppArgb);
试一试{
不安全{
使用(Stream bmpstream=新的非托管内存流((字节*)bits.Scan0,bits.Height*bits.Stride))
{
BinaryReader=新的BinaryReader(bmpstream);
for(int y=0;y
简易方法:使用位图的GetPixel(x,y)方法(慢速),使用指针读取位图(高级,但快速)。您知道使用BinaryReader而不是位图函数的方法吗?请阅读第二个解决方案“我在尝试使用BinaryReader读取位图图像的ARGB值时遇到一些问题。”到目前为止,您有什么代码?@IllidanS4 lol,位图文件格式不是仅包含像素的普通格式。它包含大量元数据,如格式、bpp、大小等,因此您应该忽略这些“垃圾”数据并开始读取实际数据,但如果不知道实际的.bmp文件结构,这是不可能的。
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);
}