C# Conversion de 32bpp image de 8bpp
Je suis en train de convertir un 32bpp capture d'écran de l'image à un 8bpp (ou 4bpp, ou 1bpp) format à l'aide de C#. Je l'ai déjà regardé plusieurs stackoverflow des réponses sur des sujets similaires et plus suggérer des variations en utilisant le code suivant:
public static Bitmap Convert(Bitmap oldbmp)
{
Bitmap newbmp = new Bitmap(oldbmp.Width, oldbmp.Height, PixelFormat.Format8bppIndexed);
Graphics gr = Graphics.FromImage(newbmp);
gr.PageUnit = GraphicsUnit.Pixel;
gr.DrawImageUnscaled(oldbmp, 0, 0);
return newbmp;
}
Cependant, lorsque cela s'exécute, j'obtiens une exception: A graphics object cannot be created from an image that has an indexed pixel format
. Je comprends que 8, 4 et 1bpp images en couleurs des mappages de table plutôt que la couleur réelle des pixels eux-mêmes (comme en 32 ou 16bpp images) donc je suppose que je suis en manque quelques une étape de conversion quelque part, mais je suis assez novice en C# (venant d'un C++ arrière-plan) et que vous préférez être en mesure de faire cela en utilisant le code C# appels plutôt que de recourir à PInvoking BitBlt
et GetDIBits
etc. Quelqu'un capable de m'aider à résoudre ce problème? Merci.
MODIFIER: je tiens à signaler que j'ai besoin de cela pour être compatibles amont .NET framework 2.0
OriginalL'auteur binarybob | 2011-06-15
Vous devez vous connecter pour publier un commentaire.
GDI+ en général est très mauvais soutien de indexés formats de pixel. Il n'existe pas de moyen simple de convertir une image avec 65536 ou 16 millions de couleurs en un seul qui n'a que 2, 16 ou 256. Les couleurs doivent être retirés de l'image source et c'est une perte de conversion qui peut avoir des résultats très médiocres. Il existe plusieurs algorithmes sont disponibles pour ce faire, aucun d'entre eux sont parfait pour chaque type d'image. C'est un travail pour un éditeur de graphiques.
Il y a un truc que j'ai trouvé. GDI+ est une image de l'encodeur des fichiers GIF. C'est un format graphique qui ne dispose que de 256 couleurs, le codeur doit limiter le nombre de couleurs. Il utilise un algorithme de dithering qui est adapté pour les photos. Il a un talent pour la génération d'un modèle de la grille, vous serez moins heureux quand il ne. L'utiliser comme ceci:
L'image renvoyée est un 8bpp format de pixel avec les entrées de Palette calculé par le codeur. Vous pouvez le convertir en Bitmap, si nécessaire. De loin la meilleure chose à faire est tout simplement de ne pas s'embêter avec indexé formats. Ils datent de l'âge de pierre de l'informatique en arrière quand la mémoire a été sérieusement entravée. Ou utilisez un éditeur de graphiques.
Vous obtiendrez un très faible qualité des résultats, de faire ce gif (truc). Je pense que la meilleure solution est d'utiliser EmguCV (opencv wrapper).
"De loin, la meilleure chose à faire est tout simplement de ne pas s'embêter avec indexé formats. Ils datent de l'âge de pierre de l'informatique en arrière quand la mémoire a été sérieusement entravée" C'est très bien, mais qu'en est lorsque vous écrivez un programme pour traiter de graphiques pour une cible de main-tenu des consoles ou smart montres de la vidéo et de la mémoire est encore à une prime?
Vous n'avez pas à vous soucier de ce que, GDI+ n'est pas disponible sur ces appareils.
OriginalL'auteur Hans Passant
AForge de la bibliothèque est de le faire parfaitement l'aide de Niveaux de gris.
OriginalL'auteur Larry
Stride négatif signifie que l'image est en bas-haut (inversé). Utilisez simplement la valeur absolue de la foulée si vous n'avez pas de soins. Je sais qui fonctionne pour 24bpp images, pas au courant si cela fonctionne pour les autres.
OriginalL'auteur Genzzry
Vous pouvez utiliser le Système.De Windows.Médias.L'imagerie en PresentationCore Assemblée de prendre un coup d'oeil à ici pour plus d'informations
Le lien ne fonctionne plus.
Vous pouvez toujours utiliser
web.archive.org
à la recherche pour les anciens liens. web.archive.org/web/20140227205223/http://msdn.microsoft.com/...OriginalL'auteur Navid Rahmani