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);
Je suis tout à fait d'accord sur FreeImage - une excellente bibliothèque pour la plupart des formats – zebrabox
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). –