使用QImageWriter压缩DDS图像

时间:2017-02-17 16:37:52

标签: c++ qt qimage

Qt的文档说QImageWriter有一个setCOmpression方法,这个方法取决于所选的图像格式。例如,对于tiff图像,0表示不压缩,1表示LZW压缩。出于同样的原因,我将我的格式设置为dds,然后按如下方式调用此方法;

QImageWriter writer(dir);
writer.setFormat("dds");
writer.setCompression(5);
bool saved = writer.write(image);

image当然是一个QImage变量。但是我的图像中没有压缩。我使用ImageMagick手动压缩,压缩后的图像尺寸较小。 Qt输出一个dds文件,但它没有被压缩。那么我该如何设置压缩。我选择5作为参数,期望它将压缩级别设置为DXT5。

2 个答案:

答案 0 :(得分:3)

在Qt实现保存压缩DDS纹理之前的一个好选择是将SOIL2静态链接到项目中。

http://rextester.com/LYE54567

您可以将save_image_as_DDS()功能与QImage一起使用,如下所示:

QImage *pTexture = [Your initial image]
AtlasTextureType eTextureType = [Your desired image type]

switch(eTextureType)
{
    case ATLASTEXTYPE_PNG: {
        if(false == pTexture->save("MyTexture.png")) {
            Log("failed to generate a PNG atlas", LOGTYPE_Error);
        }
    } break;

    case ATLASTEXTYPE_DTX5: {
        QImage imgProperlyFormatted = pTexture->convertToFormat(QImage::Format_RGBA8888);
        if(0 == SOIL_save_image_quality("MyTexture.dds",
                                        SOIL_SAVE_TYPE_DDS,
                                        imgProperlyFormatted.width(),
                                        imgProperlyFormatted.height(),
                                        4,
                                        imgProperlyFormatted.bits(),
                                        0))
        {
            Log("failed to generate a DTX5 atlas", LOGTYPE_Error);
        }
    } break;

    case ATLASTEXTYPE_DTX1: {
        QImage imgProperlyFormatted = pTexture->convertToFormat(QImage::Format_RGB888);
        if(0 == SOIL_save_image_quality("MyTexture.dds",
                                        SOIL_SAVE_TYPE_DDS,
                                        imgProperlyFormatted.width(),
                                        imgProperlyFormatted.height(),
                                        3,
                                        imgProperlyFormatted.bits(),
                                        0))
        {
            Log("failed to generate a DTX1 atlas", LOGTYPE_Error);
        }
    } break;
}

答案 1 :(得分:1)

没有压缩,因为在你正在使用的Qt版本中没有人实现它。如果在最近的Qt中没有实现该功能,请提交功能请求,修补您的Qt副本以添加此功能(可能作为后端),如果最新版本未实现,请提交您的更改以包含在Qt中:)