需要有关BMP到JPEG转换的帮助

时间:2009-07-13 17:36:41

标签: jpeg bmp huffman-code dct

我正在编写一个C ++程序,将BMP图像转换为JPEG格式。

这是我想要遵循的基本算法:

  1. 将RGB色彩空间转换为Y,Cb,Cr ..
  2. 将样品Cb和Cr降低2(这意味着每个2 * 2的方块有4个不同的Y值但是1个Cb和1个Cr值
  3. 将DCT应用于每个8 * 8像素的数据单元......
  4. 然后使用Cb和Cr的标准量化表对DCT系数进行量化。
  5. 做zigzag订购。
  6. 使用霍夫曼编码分别对DC和AC系数进行编码。
  7. 编写正确的标头并将霍夫曼编码的值写入文件...
  8. 我已经确认我正在正确执行上述操作,但我仍然遇到以下问题:

    • 生成的JPEG无法正确显示。
    • 我制作了一个小的8 * 8 24位(颜色深度)bmp文件,完整地填充了颜色值R = 10 B = 10和G = 100 ...所有64个像素都是相同的颜色..
    • 我在每一步获得的数据如下......
      • BMP标题大小为40
      • 标题40的大小
      • 宽度8
      • 身高8
      • no of planes 1
      • 每像素位数24
      • 图片大小194
      • 每分钟x分辨率像素2834
      • y每分钟像素数2834
      • no of col 0
      • no of imp colors 0
      • (R,B,G)=(10,10,100)的Y Cb Cr转化率为(62,-29,-37)

    所以我们先考虑Y分量。

    Y分量的DCT系数是:

     495 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0
    

    量化之后,对于Y分量,我得到的单个数据单元的之字形排序就是这个。

    30 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    

    现在,以上之字形顺序数组的霍夫曼编码为:

    • Y dc编码:00111110
    • Y ac编码:1010(交流霍夫曼表(亮度Y)EOB值为1010)
    • Cb和Cr组分的类似霍夫曼编码如下:
    • cb dc coding:11000010
    • cb ac编码:01(用于交流霍夫曼表(色度Cb,Cr)EOB值为01)
    • cr dc coding:110101110
    • cr ac coding:01
    • 我得到的最终霍夫曼代码是:

      001111101010110000100111010111001长度33

    因此,为了使其可被8整除,填充为1。

    0011111010101100001001110101110011111111 Length 40.
    

    这里每个单独的0或1实际上是一个需要存储在JPEG文件中的位,但由于我们无法逐位写入文件,因此总共需要8位并转换为整数基数为10的值,并存储为1字节字符。

    任何人都可以就我出错的地方提出任何建议吗?

2 个答案:

答案 0 :(得分:2)

解决问题的第一步是让Pennebaker / Mitchel书籍符合JPEG标准。

操作顺序为:

1)色彩空间转换 2)FDCT 3)量化 4)Zigzag重新排序 5)霍夫曼编码

由于您必须遵循许多规则,这些操作有许多复杂性。

a)您是否正确处理DC预测器? b)您是否正确编码了A / C组件w.r.t.零的运行? c)您是否尊重关于“填充零”和标记的输出流规则? d)您的色彩空间转换公式是否正确?它是否包含必须从每个组件中减去的0x80? e)您是否根据您选择的子采样选项以正确的顺序对MCU块进行编码?

答案 1 :(得分:-1)

不要重新发明轮子。使用ImageMagick,Magick ++或CImg来实现这一目标。