2009-08-01 112 views
2

我有一些内存中的图像以各种简单的格式,我需要快速转换为另一种格式。如果目标格式包含一个alpha通道,但是该通道没有,alpha应该被视为其全部值(例如,8位目标alpha通道的0xFF)。C++快速的图像格式转换方式

我需要能够处理各种格式,比如A8R8G8B8,R8G8B8A8,A1R4G4B4,R5G6B5等像素的任何这些格式之间

转换简单,但是我不希望有为了手动编码每一个组合,我也不希望在转换为最终格式之前转换为通用格式(例如A8R8G8B8)的2遍解决方案,因为性能原因,如果我想使用更高版本高清格式,说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

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

您也可以尝试ImageMagick只是来回转换,如果你不想做任何他们。

+0

绝对同意有关的FreeImage - 对于大多数格式 – zebrabox 2009-08-01 19:10:46

0

10年前我用了爱马仕像素转换库,这是非常快的。有可能将640x480 32位图像转换为15或16位图像,每秒至少30图像。我们使用它作为演示引擎。不幸的是,我现在找不到链接。在Debian软件包是孤立的..

但是,这正是你要使用实时使用什么..