【问题标题】:how to get RGB888 (24 - bit) and RGB565 (16-bit) framebuffer dump from a jpg image?如何从 jpg 图像中获取 RGB888(24 位)和 RGB565(16 位)帧缓冲区转储?
【发布时间】:2013-10-08 12:29:03
【问题描述】:

我需要以 jpg/png 格式调整图像的大小(放大或缩小)。我正在使用双线性插值来调整大小。我的代码适用于我在数组中给出的值。但是要使用图像测试结果,我需要 RGB565 和 RGB888 转储。

由于我的任务只是调整图像的大小,如果我能获得具有图像宽度和高度的转储,或者只是一个算法也可以,我将不胜感激。

我正在研究 C。请帮助我。

谢谢

【问题讨论】:

  • 我不太确定我是否正确理解了您的问题。但似乎您正在寻找一个库来解码 PNG 和 JPEG 图像。看看libjpeglibpng
  • @Codo 好的,谢谢。但我需要将它们解码为 RGB565 格式。我该怎么做?如果我的 linux 系统中已经安装了 libjpeg 库,那么这个 libjpeg 源代码还有用吗??

标签: c image-processing


【解决方案1】:

如果您缺少的只是从 RGB888 到 RGB565 的转换,那么这很容易。为每个像素调用以下函数:

unsigned short int rgb888Torgb565(unsigned int rgb888Pixel)
{
    int red   = (rgb888Pixel >> 16) & 0xff;
    int green = (rgb888Pixel >> 8 ) & 0xff;
    int blue  =  rgb888Pixel        & 0xff;

    unsigned short  b =   (blue  >> 3) & 0x001f;
    unsigned short  g = ( (green >> 2) & 0x003f ) << 5;
    unsigned short  r = ( (red   >> 3) & 0x001f ) << 11;

    return (unsigned short int) (r | g | b);
}

将函数应用于所有像素。每个将从 3 个字节缩小到 2 个字节。

【讨论】:

  • 非常感谢.. 但我的问题是我没有转换形式的图像,无论是 rgb888。我只有一张图片,我必须应用我的算法来调整它的大小。这就是为什么我需要将 jpg 文件转换为 rgb888 或 rgb565。请告诉我是否可以将图像转换为 RGB888 格式。
  • 是的,libjpeg 和 libpng 可以将图像转换为 RGB888。 RGB888 是一种简单的格式,其中每个像素的红色、绿色和蓝色分量使用 1 个字节(8 位)。在 libpng 中,RGB888 是位深度为 8 的 PNG_COLOR_TYPE_RGB 格式。但它不是您可以调用的单个函数。您需要研究 libpng 的文档。
  • 绿色部分需要放在第5位,unsigned short g = ( (green &gt;&gt; 2) &amp; 0x003f ) &lt;&lt; 5;
【解决方案2】:

我在 Python 中将 png 转换为原始 RGB 565 格式的解决方案(称为 png2fb.py):

#!/usr/bin/python

import sys
from PIL import Image

if len(sys.argv) == 3:
    # print "\nReading: " + sys.argv[1]
    out = open(sys.argv[2], "wb")
elif len(sys.argv) == 2:
    out = sys.stdout
else:
    print "Usage: png2fb.py infile [outfile]"
    sys.exit(1)

im = Image.open(sys.argv[1])

if im.mode == "RGB":
    pixelSize = 3
elif im.mode == "RGBA":
    pixelSize = 4
else:
    sys.exit('not supported pixel mode: "%s"' % (im.mode))

pixels = im.tostring()
pixels2 = ""
for i in range(0, len(pixels) - 1, pixelSize):
    pixels2 += chr(ord(pixels[i + 2]) >> 3 | (ord(pixels[i + 1]) << 3 & 0xe0))
    pixels2 += chr(ord(pixels[i]) & 0xf8 | (ord(pixels[i + 1]) >> 5 & 0x07))
out.write(pixels2)
out.close()

【讨论】:

  • 修复该导入后效果很好。应该有一个from PIL import Image 而不是Image
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 2013-02-19
  • 2012-10-14
  • 2020-03-30
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多