2009-08-01 3 views
2

J'ai quelques images en mémoire dans divers formats simples, que j'ai besoin de convertir rapidement en un autre format. Dans les cas où le format cible contient un canal alpha mais que la source ne le fait pas, alpha doit être considéré comme sa valeur complète (par exemple 0xFF pour un canal alpha cible de 8 bits).C++ Façon rapide de convertir entre les formats d'image

Je dois être en mesure de traiter divers formats, tels que A8R8G8B8, R8G8B8A8, A1R4G4B4, R5G6B5, etc.

Conversion de pixels entre l'un de ces formats est simple, mais je ne veux pas avoir pour coder manuellement chaque combinaison, je ne veux pas non plus avoir une solution en 2 passes de conversion vers un format commun (par exemple A8R8G8B8) avant de convertir à nouveau au format final à la fois pour des raisons de performance, et si je veux utiliser un format de définition, disons A16B16G16R16 ou un virgule flottante Je perdrait certaines données de conversion au format intermédiaire, ou je devrais réécrire tout pour utiliser un format différent de définition plus élevée ...

Ide id allié comme une sorte de ENUM avec des valeurs pour chaque format, puis une seule méthode pour convertir, par exemple, dire

enum ImageFormat 
{ 
    FMT_A8R8G8B8,//32bit 
    FMT_A1R4G4B4,//16bit 
    FMT_R5G6B5,//16bit 
    FMT_A32R32G32B32F,//128bit floating point format 
    ... 
}; 
struct Image 
{ 
    ImageFormat Format; 
    size_t Width, Height; 
    size_t Pitch; 
    void *Data; 
}; 
Image *ConvertImage(ImageFormat *targetFormat, const Image *sourceImage); 

Répondre

3

Jetez un oeil à FreeImage; c'est une bibliothèque qui va convertir entre différentes images.

Vous pouvez également essayer ImageMagick de convertir juste en arrière, si vous ne voulez rien faire pour eux.

+0

Je suis tout à fait d'accord sur FreeImage - une excellente bibliothèque pour la plupart des formats – zebrabox

+0

J'utilise FreeImage pour tous les prétraitements hors ligne, bien que je ne pense pas qu'il supporte tous les formats que vous voulez, ainsi qu'un seul passage. En fait, je pense que vous devrez le faire à la main, surtout si la performance compte (ce qui est généralement le cas). –

0

Il ya 10 ans, j'ai utilisé la bibliothèque de conversion hermes pixel, qui était très rapide. Il était possible de convertir des images 32 bits 640x480 en images 15 ou 16 bits avec au moins 30 images par seconde. Nous l'avons utilisé pour un moteur de démonstration. Malheureusement, je ne peux pas trouver un lien pour le moment. Sur le paquet debian est devenu orphelin ..

Mais c'est exactement ce que vous voulez utiliser pour une utilisation en temps réel ..