web-dev-qa-db-fra.com

Graphiques sur l'image indexée

Je reçois une erreur:

"Un objet graphique ne peut pas être créé à partir d'une image dont le format de pixel est indexé."

en fonction:

public static void AdjustImage(ImageAttributes imageAttributes, Image image)
{
        Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);

        Graphics g = Graphics.FromImage(image);       
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAttributes);
        g.Dispose();
}

Je voudrais vous demander, comment puis-je y remédier?

28
Krivers

En se référant à this , cela peut être résolu en créant un bitmap vierge avec les mêmes dimensions et le PixelFormat correct et le dessin sur ce bitmap.

// The original bitmap with the wrong pixel format. 
// You can check the pixel format with originalBmp.PixelFormat
Bitmap originalBmp = new (Bitmap)Image.FromFile("YourFileName.gif");

// Create a blank bitmap with the same dimensions
Bitmap tempBitmap = new Bitmap(originalBmp.Width, originalBmp.Height);

// From this bitmap, the graphics can be obtained, because it has the right PixelFormat
using(Graphics g = Graphics.FromImage(tempBitmap))
{
    // Draw the original bitmap onto the graphics of the new bitmap
    g.DrawImage(originalBmp, 0, 0);
    // Use g to do whatever you like
    g.DrawLine(...);
}

// Use tempBitmap as you would have used originalBmp
return tempBitmap;
33
Microsoft DN

Le moyen le plus simple est de créer une nouvelle image comme celle-ci:

Bitmap EditableImg = new Bitmap(IndexedImg);

Il crée une nouvelle image exactement comme l'original avec tout son contenu.

6
Bart Vanseer

Dans l'ensemble, si vous souhaitez travailler avec des images indexées et conserver leur palette de couleurs et leur palette de couleurs, cela impliquera toujours d'écrire des vérifications explicites et un code spécial pour elles. Graphics ne peut tout simplement pas fonctionner avec eux, car il manipule les couleurs, et les pixels réels des images indexées ne contiennent aucune couleur, juste des index.

Pour tous ceux qui le voient encore toutes ces années plus tard ... la manière valide de peindre une image sur une image indexée existante (8 bits) est la suivante:

  • Passez en revue tous les pixels de l'image que vous souhaitez coller et, pour chaque couleur, trouvez la correspondance la plus proche dans la palette de couleurs de l'image cible , et enregistrez son index dans un tableau d'octets.
  • Ouvrez le tableau des octets de support de l'image indexée à l'aide de LockBits et collez-y vos octets correspondants, à l'emplacement souhaité, en bouclant sur les index appropriés en utilisant la hauteur et la foulée de l'image.

Ce n'est pas une tâche facile, mais c'est certainement possible. Si l'image collée est également indexée et contient plus de 256 pixels, vous pouvez accélérer le processus en effectuant la correspondance des couleurs sur la palette plutôt que sur les données d'image réelles, puis en obtenant les octets de support de l'autre image indexée et en remappant les en utilisant le mappage créé.

Notez que tout cela ne s'applique qu'à huit bits. Si votre image est en quatre bits ou en un bit, la façon la plus simple de la gérer est de la convertir en 8 bits en premier afin de pouvoir la gérer comme un octet par pixel, puis de la reconvertir ensuite.

Pour plus d'informations à ce sujet, voir Comment puis-je travailler avec des images 1 bit et 4 bits?

1
Nyerguds