2017-02-17 31 views
3

В документации для Qt указано, что QImageWriter имеет метод setCOmpression и этот метод зависит от выбранного формата изображения. Например, для tiff-изображений 0 означает отсутствие сжатия и 1 означает сжатие LZW. Точно так же я устанавливаю свой формат в dds, затем вызываю этот метод следующим образом;Сжатие изображений DDS с использованием QImageWriter

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