【发布时间】:2013-11-13 21:06:00
【问题描述】:
我有每个像素的数据红色一个字节,绿色一个字节,蓝色一个字节。我需要把它打包成 8 位位图,所以我只有一个字节的像素。如何将 rgb(三个字节)转换为位图格式的一个字节? (我使用的是 C++,不能使用任何外部库)
【问题讨论】:
我有每个像素的数据红色一个字节,绿色一个字节,蓝色一个字节。我需要把它打包成 8 位位图,所以我只有一个字节的像素。如何将 rgb(三个字节)转换为位图格式的一个字节? (我使用的是 C++,不能使用任何外部库)
【问题讨论】:
我想你误解了如何形成位图结构。您不需要(以某种方式)将 3 个字节打包成一个。毕竟这是不可能的,除非你丢弃信息(比如使用special image formats GL_R3_G3_B2)。
BMP file format wiki page 显示详细的 BMP 格式:它是一个标头,后面是数据。现在根据您在标题中设置的内容,可以形成包含 RBG 数据组件的 BMP 图像,其中每个组件是一个字节。
【讨论】:
首先,您需要确定要为每种颜色分配多少位。
每种颜色 3 位会溢出一个字节(9 位)
每种颜色 2 位会下溢;
在三字节 RGB 位图中,您有一个字节来表示每种颜色的强度。其中 0 是最小值,255 是最大强度。当您将其转换为 1 字节位图(假设您将选择 2bits per color )时,转换应该是:
1-byte red color/64
也就是说,在每种颜色 265 种色调的光谱中,您只会得到 4 种色调。
【讨论】:
首先你必须produce 256 colors palette that best fits your source image.
那你需要dither the image using the palette you've generated。
这两个问题都有许多众所周知的解决方案。但是,完全自动生成高质量的结果是不可能的:对于不同的源图像,不同的方法效果最好。例如,这里是调整过程参数的 Photoshop UI:
【讨论】: