繁体   English   中英

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

[英]C# Using BinaryReader to read color byte values of a bitmap image

我正在使用BinaryReader读取图像的字节,尝试使用BinaryReader读取位图图像的ARGB值时遇到一些问题。 谁能建议我可以获取位图图像中每个像素的字节值的方法?

提前致谢

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

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

您将需要研究以下可用的BMP文件格式: http : //en.wikipedia.org/wiki/BMP_file_format正确读取文件将涉及从标头中找出像素格式并基于此正确解析数据。 该文件可能会被标上参数,在这种情况下,您将需要读出颜色表数据并将其用于将像素映射到实际颜色。 像素数据也可能会被压缩,并且必须根据标头中的值进行提取。

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

如果您需要使用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM