Ce qui est un bon, optimisé C/C++ de l'algorithme de conversion d'un bitmap 24 bits à 16 bits avec dithering?
J'ai été à la recherche d'une optimisation (c'est à dire, rapide) algorithme qui convertit un bitmap de RVB 24 bits à 16 bits (RGB565) bitmap à l'aide de la fonction de tramage. Je suis à la recherche de quelque chose en C/C++ où je peux réellement contrôler la façon dont la juxtaposition est appliquée. GDI+ semble fournir certaines méthodes, mais je ne peux pas dire si ils tramage ou pas. Et, si elles ne tergiversons, quels mécanismes sont-ils en utilisant (Floyd-Steinberg?)
Quelqu'un aurait-il un bon exemple de la bitmap de l'intensité de couleur de conversion avec dithering?
565 toujours terrible, même avec les meilleurs dithering. Juste par curiosité, pourquoi le faire?
Je suis en désaccord, voir cet exemple: stackoverflow.com/a/3963150/5987
c'est parce que je suis sortie d'un morceau de matériel qui prend en charge uniquement RGB565. Il ne sera pas affichée sur le moniteur de l'utilisateur.
Je remarque que c'est une seule image couleur.
Je suis heureux de répéter l'expérience sur n'importe quelle image que vous souhaitez.
Je suis en désaccord, voir cet exemple: stackoverflow.com/a/3963150/5987
c'est parce que je suis sortie d'un morceau de matériel qui prend en charge uniquement RGB565. Il ne sera pas affichée sur le moniteur de l'utilisateur.
Je remarque que c'est une seule image couleur.
Je suis heureux de répéter l'expérience sur n'importe quelle image que vous souhaitez.
OriginalL'auteur JacobJ | 2012-07-24
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez mentionné, le tramage de Floyd-Steinberg méthode est populaire parce qu'il est simple et rapide. Pour les différences subtiles entre 24-bit et 16-bit couleur, les résultats seront presque optimale visuellement.
Il a été suggéré que j'utilise l'image de l'échantillon Lena mais j'ai décidé contre elle; en dépit de sa longue histoire comme une image de test, je considère qu'il est trop sexiste de la sensibilité moderne. Au lieu de cela, je présente une photo de mon propre. La première est l'original, suivie par la conversion à l'oue RGB565 (et converti en 24 bits pour l'affichage).
Et le code en C++:
Je ne vais pas sûr que ce code est parfait, j'ai déjà eu à résoudre l'un de ces subtiles erreurs que je l'ai mentionné dans un autre commentaire. Il n'a toutefois générer les résultats ci-dessus. Il faut 24 bits pixels dans BGR ordre que celui utilisé par Windows, et produit R5G6B5 pixels 16 bits en little endian commande.
OriginalL'auteur Mark Ransom
J'ai suggéré d'utiliser commandé tramage (http://en.wikipedia.org/wiki/Ordered_dithering), depuis de Floyd-Steinberg besoin de plus de traitement et de calcul et ne fonctionne que sur une image fixe /ne fonctionne pas bien pour l'animation ou de la constante changé sur l'écran.
J'ai Créé mon propre optimisé commandé le tramage de 24/32 bits de couleur RVB 16 bits RGB565 couleur, que séparée tresshold en sous-pixel (Utilisé dans mon ARÔME projet). Il était beaucoup plus rapide, puis de Floyd-Steinberg, car il n'est pas coûteux calculs (spécialement pas se multiplie et les divs calculs), et de pouvoir utilisé sur les animations parce qu'il fixe tresshold.
C'est la qualité aussi tellement mieux que commandé algorithme de dithering que défini sur le wiki.
Ici un exemple de tramage résultat:
Et ici, la source. Profitez-en!
Un autre Résultat (en Haut à 24bit - Bas Commandé RGB565-16bit):
Vue pleine résolution de l'image
OriginalL'auteur amarullz
Tramage de Floyd–Steinberg
J'ai parié de l'argent vous pouvez mettre en place facilement!
C'est un algorithme où il est facile de faire des erreurs subtiles. @JacobJ, je vais essayer de faire un C/C++ mise en œuvre pour vous ce soir.
Merci! J'essaye de faire de mon propre mise en œuvre maintenant, mais j'aimerais comparer avec ce que vous venez avec! Je viens de remarqué que je vais en fait d'un 32-bit ARGB de la mémoire tampon (UINT32*) pour une RGB565 tampon (UINT16*). Ces 4 dernières lignes sont celles qui semblent les plus difficiles. J'ai besoin de décalage de bit soigneusement. Si vous faire ça ce soir, merci de poster une réponse! 😉
Je me demande si vous avez besoin d'être prudent afin de faire les calculs en linéaire RVB et ensuite de les convertir en sRGB à la fin. Pensez-vous que cela ferait une grande différence?
les calculs sur RGB impliquant l'addition ou la soustraction sera plus correct dans un espace linéaire, mais j'ai trouvé que le fait de travailler directement avec sRGB est "assez proche" dans la plupart des cas.
OriginalL'auteur cybertextron