2017-02-17 1 views
3

La documentation de Qt indique que QImageWriter possède une méthode setCOmpression et que cette méthode dépend du format d'image choisi. Par exemple, pour les images tiff, 0 signifie pas de compression et 1 signifie compression LZW. Du même coup, je règle mon format sur dds puis appelle cette méthode comme suit;Compression d'images DDS à l'aide de QImageWriter

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

image est une variable QImage bien sûr. Mais il n'y a pas de compression dans mon image résultante. J'utilise ImageMagick pour compresser manuellement et l'image compressée a une taille inférieure. Qt sort un fichier dds mais il n'est pas compressé. Alors, comment puis-je définir la compression. J'ai choisi 5 comme un paramètre s'attendant à ce que le niveau de compression serait DXT5.

Répondre

1

Il n'y a pas de compression car personne ne l'a implémenté dans la version Qt que vous utilisez. Déposer une demande de fonctionnalité si la fonctionnalité n'est pas implémentée dans Qt la plus récente, patcher votre copie de Qt pour ajouter cette fonctionnalité (éventuellement comme backport) et soumettre votre modification pour inclusion dans Qt si la version la plus récente ne l'implémente pas :)

+0

Quelle version est-ce? – dtech

+0

@ddriver Quelle que soit la version utilisée par le demandeur :) Nous ne pouvons que deviner ici. –

+1

Il semblait juste que vous connaissiez la version particulière sans qu'il soit déclaré ou implicite. Et aussi qu'il est implémenté dans une version particulière. Une question de libellé je suppose;) – dtech

3

Une bonne option jusqu'à ce que Qt implémente l'enregistrement des textures DDS compressées est de lier statiquement SOIL2 dans votre projet.

https://bitbucket.org/SpartanJ/soil2

Vous pouvez utiliser la fonction save_image_as_DDS() avec un QImage comme ce qui suit:

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