使用QimageWriter压缩DDS图像

Compressing DDS images using QImageWriter

本文关键字:图像 DDS 压缩 QimageWriter 使用      更新时间:2023-10-16

qt的文档说qimageWriter具有setCompression方法,并且此方法取决于所选的图像格式。例如,对于TIFF图像,0表示没有压缩,1表示LZW压缩。同样,我将格式设置为DD,然后将此方法称为如下;

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

image当然是一个qimage变量。但是我由此产生的图像没有压缩。我使用ImageMagick手动压缩图像尺寸较低。QT输出DDS文件,但没有压缩。因此,我该如何设置压缩。我选择5作为一个参数,期望它将压缩级别设置为dxt5。

一个不错的选择,直到QT实现保存压缩的DDS纹理是静态地将土壤链接到您的项目中。

https://bitbucket.org/spartanj/soil2

您可以将其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;
}

没有压缩,因为您正在使用的QT版本中没有任何压缩。文件请求如果在最近的QT中未实现该功能,请修补您的QT副本以添加此功能(可能是作为BackPort),如果最新版本未实现该功能,请提交更改以包含在QT中:)