【发布时间】:2014-02-26 09:50:13
【问题描述】:
我在嵌入式设备中使用了一种奇怪的图像格式,并且像往常一样,文档没有帮助......
下面是两行doc:
图片是:
全彩色位图(每像素 4+4+4bit),3 字节 每两个像素(像素顺序从左到右)。
所以,为了能够得到一个字节序列的图像,我编写了以下代码:
// size_x and size_y are known at this point
QImage img(size_x, size_y, QImage::Format_RGB444);
int xctr = 0;
int yctr = 0;
for(int c1 = 0; c1 < bsize; ) // bsize is the size of image bytes
{
static const int M = 1; // a multiplier to make the image brighter
uint8_t b1 = *(p_pos + c1++); // p_pos points to the first image byte
uint8_t b2 = *(p_pos + c1++);
uint8_t b3 = *(p_pos + c1++);
uint8_t pix1_r =( (b1 & 0xF0) >> 4 ) * M;
uint8_t pix1_g =( (b1 & 0xF) ) * M;
uint8_t pix1_b =( (b2 & 0xF0) >> 4 ) * M;
uint8_t pix2_r =( (b2 & 0xF) ) * M;
uint8_t pix2_g =( (b3 & 0xF0) >> 4 ) * M;
uint8_t pix2_b =( (b3 & 0xF) ) * M;
// old code
//unsigned int pix1 = pix1_r << 8 | pix1_g << 4 | pix1_b;
//unsigned int pix2 = pix2_r << 8 | pix2_g << 4 | pix2_b;
// new code
unsigned int pix1 = ((unsigned int)pix1_r) << 8 | pix1_g << 4 | pix1_b;
unsigned int pix2 = ((unsigned int)pix2_r) << 8 | pix2_g << 4 | pix2_b;
// set the first pixel
img.setPixel(xctr, yctr, pix1);
xctr ++;
if(xctr == size_x) {
xctr = 0;
yctr ++;
}
// set the second pixel
img.setPixel(xctr, yctr, pix2);
xctr ++;
if(xctr == size_x) {
xctr = 0;
yctr ++;
}
}
这是我由此得到的图像:
这是我应该得到的图像(非常相似)(只有蓝色/洋红色部分,请不要考虑黑色背景和雪 :)):
对于勇敢的人,图像数据:http://pastebin.com/m4y8qamB,请随时使用此Python creating an array from hex bytes 将原始数据转换为“真实”十六进制字节。
还有一个问题:现在,忽略嵌入在设备本身中的图像调色板,我做错了什么,我没有获得与预期相似的图像?我应该怎么做才能获得相似的图像?
编辑在添加一些解码值(和打印字符)的打印输出后,我得到如下内容:
PPPPPPPPPPPPPPPPPPPAPPPPPPPPPPPP
PPPPPPPAPPPPPPPPPPPPPPPPPPPAPPPP
PPPPPPPPPPPPPPPAPPPPPPPPPPPPPPPP
PPPAPPPPPPPPPPPPPPPPPPPAPPPPPPPP
PPPPPPPPPPPAPPPPPPPPPPPPPPPPPPPA
PPPPPPPPPPPPPPPPPPPAPPPPPPPPPPPP
PPPPPPPAPPPPPPPPPPPPPPPPPPPAPPPP
PGPPPPPPPPPPPPPAPPPPPCANMMMMMMMM
MMMMAMMMMOPCALDDDDDDDDDDDADDDMPC
ANODDDDDDDDDDDDADDKPANPCAGMMMMMM
MMMMMMAMMNPCANPCANPCANPCANPCANPC
ANPCANPPPAPPANPCANPCANPCANPCANPC
ANPCANPCADDADDPCANPCANPCANPCANPC
ANPCANPCANPCMMAMMMMMMMMMMMMMMMMM
MMAMMMMMMMMMMMMMMMMMMMAMMMMMMMMM
MMMMMMMMMMAMMMMMMMMMMMMMMMMMMMAM
MMMMMMMMMMMMMMMMMMAMMMMMMMMMMMMM
MMMMMMAMMMMMMMMMMMMMMMMMMMAMMMMM
MMMMMMMMMMMMMMAMMMMMMMMMMMMMMMMM
MMAMMMMMMMMMMMMMMMMMMMAMMMMMMMMM
【问题讨论】:
-
您检查过您的 size_x 和 size_y 是否正常?该结果看起来与原始的比例不同。
-
在
pix1_r << 8中,pix1_r是8位变量,做8位移位会变0,建议你typecast成16位或者32位。 -
它们也与图像字节一起被编码在图像数据中(参见粘贴箱)。我感觉原版没有使用方形像素,因为它是 33x18)
-
@MadHatter 现在就这样做了,它没有帮助 :( 问题已更新
-
你确定你的 size_x 和 size_y,并且 p_pos 是一个
char *(或者至少是一个指向 8 位值的指针)吗?您的 pastebin 在开始和结束处具有相同的模式(39 33 93 重复,应转换为 393 393),这意味着,如果您正确读取数据,至少第一行和最后一行应该是相同的。我将 img.setPixel 替换为 printf("%3x", pix1) 和 yctr++ 替换为 putchar('\n') 以查看您的解码器实际解码的内容。