c# image graphics indexed-image

c# - Gráficos en imagen indexada.



graphics indexed-image (3)

En general, si desea trabajar con imágenes indexadas y, de hecho, conservar la profundidad de color y la paleta, esto siempre significará escribir cheques explícitos y un código especial para ellas. Graphics simplemente no pueden funcionar con ellos, ya que manipulan los colores, y los píxeles reales de las imágenes indexadas no contienen colores, solo índices.

Para cualquiera que siga viendo esto todos estos años después ... la forma válida de pintar una imagen en una imagen indexada existente (8 bits) es esta:

  • Recorra todos los píxeles de la imagen que desea pegar y, para cada color, encuentre la coincidencia más cercana en la paleta de colores de la imagen de destino y guarde su índice en una matriz de bytes.
  • Abra la matriz de bytes de respaldo de la imagen indexada utilizando LockBits, y pegue los bytes coincidentes en ella, en la ubicación deseada, haciendo un bucle sobre los índices relevantes utilizando la altura y el paso de la imagen.

No es una tarea fácil, pero ciertamente es posible. Si la imagen pegada también está indexada y contiene más de 256 píxeles, puede acelerar el proceso haciendo la coincidencia de colores en la paleta en lugar de en los datos de imagen reales, obteniendo los bytes de respaldo de la otra imagen indexada y volviendo a asignar ellos utilizando el mapeo creado.

Tenga en cuenta que todo esto solo se aplica a ocho bits. Si su imagen es de cuatro bits o de un bit, la forma más sencilla de manejarla es convertirla a 8 bits primero para que pueda manejarla como un byte por píxel y volver a convertirla después.

Para obtener más información al respecto, consulte ¿Cómo puedo trabajar con imágenes de 1 y 4 bits?

Estoy recibiendo error:

"No se puede crear un objeto gráfico a partir de una imagen que tiene un formato de píxel indexado".

en función:

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(); }

Me gustaría preguntarte, ¿cómo puedo solucionarlo?


La forma más sencilla es crear una nueva imagen como esta:

Bitmap EditableImg = new Bitmap(IndexedImg);

Crea una nueva imagen exactamente igual que la original con todos sus contenidos.


Refiriéndose a this , se puede resolver creando un mapa de bits en blanco con las mismas dimensiones y el PixelFormat correcto y el dibujo en ese mapa de bits.

// 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;