如何使用C#将1位图像转换为8位图像?应该使用什么颜色的矩阵?你能提供样品或链接吗?
答案 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)