【问题标题】:C++ Fast way to convert between image formatsC++ 快速转换图像格式的方法
【发布时间】:2023-03-12 18:53:02
【问题描述】:

我有一些各种简单格式的内存图像,我需要快速转换成另一种格式。如果目标格式包含 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);

【问题讨论】:

    标签: c++ image-processing


    【解决方案1】:

    您可能需要boost::gil。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 完全同意 FreeImage - 适用于大多数格式的优秀库
      • 我使用 FreeImage 进行所有离线预处理,但我认为它不支持您想要的所有格式,并且仅支持 1-pass。实际上,我认为您必须手动完成,尤其是在性能很重要的情况下(通常这样做)。
      【解决方案3】:

      10年前我用过hermes像素转换库,速度非常快。可以将 640x480 32 位图像转换为 15 或 16 位图像,每秒至少 30 张图片。我们将其用于演示引擎。不幸的是,我目前找不到链接。在 debian 上,该软件包是孤立的..

      但这正是您想要用于实时使用的东西..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多