我在内存镜像中有一些简单格式,需要快速将其转换为另一种格式。如果目标格式包含Alpha通道但源格式不包含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);
最佳答案
您可能需要boost::gil
。