C ++在图像格式之间快速转换的方法

时间:2009-08-01 19:01:05

标签: c++ image-processing

我有各种简单格式的内存图像,我需要快速转换为另一种格式。如果目标格式包含alpha通道但源不包含,则应将alpha视为其完整值(例如,对于8位目标alpha通道为0xFF)。

我需要能够处理各种格式,例如A8R8G8B8,R8G8B8A8,A1R4G4B4,R5G6B5等。

在任何这些格式之间转换像素很简单,但是我不想手动编码每一个组合,我也不希望有一个转换为通用格式的2遍解决方案(例如A8R8G8B8) )在出于性能原因再次转换为最终格式之前,如果我想使用更高的定义格式,比如A16B16G16R16或浮点数,我要么将一些数据转换为中间格式,要么必须重写所有内容使用不同的更高清晰度格式...

理想情况下,id就像某种带有每种格式值的枚举,然后是单个转换方法,例如

enum ImageFormat
{
    FMT_A8R8G8B8,//32bit
    FMT_A1R4G4B4,//16bit
    FMT_R5G6B5,//16bit
    FMT_A32R32G32B32F,//128bit floating point format
    ...
};
struct Image
{
    ImageFormat Format;
    size_t Width, Height;
    size_t Pitch;
    void *Data;
};
Image *ConvertImage(ImageFormat *targetFormat, const Image *sourceImage);

3 个答案:

答案 0 :(得分:3)

看看FreeImage;它是一个可以在各种图像之间进行转换的库。

如果您不想对他们做任何事情,您也可以尝试ImageMagick来回转换。

答案 1 :(得分:3)

您可能需要boost::gil

答案 2 :(得分:0)

10年前,我使用了 hermes像素转换库,这非常快。可以将640x480 32位图像转换为15或16位图像,每秒至少30个图像。我们将它用于演示引擎。不幸的是,我目前找不到链接。在debian上,包裹是孤儿..

但这正是您想要用于实时使用的内容..