2017-02-17 250 views
3

Qt的文档说QImageWriter具有setCOmpression方法,并且此方法取决于所选的图像格式。例如,对于tiff图像,0表示无压缩,1表示LZW压缩。同样,我将我的格式设置为dds,然后按如下方式调用此方法;使用QImageWriter压缩DDS图像

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

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

回答

1

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

+0

哪个版本是什么? – dtech

+0

@ddriver无论什么版本的提问者碰巧正在使用:)我们只能猜测在这里。 –

+1

它只是听起来像你知道的特定版本没有它的声明或暗示。并且它也是在特定版本中实现的。我猜想是措辞问题;) – dtech

3

一个很好的选择,直到Qt实现保存压缩的DDS纹理是静态链接SOIL2到您的项目。

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; 
}