我有各种简单格式的内存图像,我需要快速转换为另一种格式。如果目标格式包含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);
答案 0 :(得分:3)
看看FreeImage;它是一个可以在各种图像之间进行转换的库。
如果您不想对他们做任何事情,您也可以尝试ImageMagick来回转换。
答案 1 :(得分:3)
您可能需要boost::gil
。
答案 2 :(得分:0)
但这正是您想要用于实时使用的内容..