将1位图像转换为8位

时间:2009-10-09 18:41:21

标签: c# image

如何使用C#将1位图像转换为8位图像?应该使用什么颜色的矩阵?你能提供样品或链接吗?

2 个答案:

答案 0 :(得分:3)

免责声明:我不知道C#,但我在C / C ++上做了太多的图像处理,所以我不能传递回答 - 我会用C回答,因为我认为C#有相似的语法。 / p>

1bit(两种颜色)和8bit(256种颜色)图像都有调色板。但转换1位到8位的转换很容易 - 因为没有涉及量化,只是上采样。

首先,您需要选择(或导入)1位图像调色板的两种颜色。如果你没有,为了清晰起见,我建议使用黑色(0x000000FF)和白色(0xFFFFFFFF)(注意:两种颜色都是RGBA,我认为windows使用ABGR)。这将是你的'调色板'。

然后将每种颜色映射到调色板 - 输入图像将具有width * height / 8个字节。每个字节代表八个像素。因为我不知道你在bittwiddling方面的专业知识(即我不想让你感到困惑,我不想让你盲目地复制和粘贴你在互联网上被授予的代码),我会保留这个答案简单。

    // Insert your image's attributes here
int w = image.width;
int h = image.height;
    // Data of the image
u8* data = image.data;

/* 
 * Here, you should allocate (w * h) bytes of data.
 * I'm sure C# has ByteArray or something similar...
 * I'll call it output in my code.
 */

u8* output = new u8[w * h];
u8* walker = output;

    // Loop across each byte (8 pixels)
for(int i=0; i<w*h/8; ++i) {
        // Loop across each pixel
    for(int b=(1<<7); b>0; b>>=1) {
            // Expand pixel data to output
        *walker++ = !!(data[i] & b);
    }
}

希望有所帮助!

答案 1 :(得分:1)

这有用吗:

http://www.wischik.com/lu/programmer/1bpp.html

但当然需要一些清理。它可以使用一些try..finally的所有删除和释放DC的

相关问题