2010-05-15 15 views
8

Estoy tratando de establecer un color de píxel dado de la imagen. Aquí es el fragmento de códigoConfiguración de color de píxel del archivo BMP/JPG

 Bitmap myBitmap = new Bitmap(@"c:\file.bmp"); 

     for (int Xcount = 0; Xcount < myBitmap.Width; Xcount++) 
     { 
      for (int Ycount = 0; Ycount < myBitmap.Height; Ycount++) 
      { 
       myBitmap.SetPixel(Xcount, Ycount, Color.Black); 
      } 
     } 

Cada vez que tengo la siguiente excepción:

Excepción no controlada: System.InvalidOperationException: SetPixel no es compatible para las imágenes con formatos de píxeles indexados.

La excepción se produce tanto para bmp y jpg archivos.

Respuesta

6

intente lo siguiente

Bitmap myBitmap = new Bitmap(@"c:\file.bmp"); 
MessageBox.Show(myBitmap.PixelFormat.ToString()); 

Si se obtiene "Format8bppIndexed" entonces el color de cada píxel del mapa de bits se sustituye por un índice en una tabla de 256 colores . y, por lo tanto, cada píxel está representado por un solo byte. puede obtener una amplia gama de colores:

if (myBitmap.PixelFormat == PixelFormat.Format8bppIndexed) { 
    Color[] colorpal = myBitmap.Palette.Entries; 
} 
15

Tiene que convertir la imagen de indexada a no indexada. Prueba este código para convertirlo:

public Bitmap CreateNonIndexedImage(Image src) 
    { 
     Bitmap newBmp = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     using (Graphics gfx = Graphics.FromImage(newBmp)) { 
      gfx.DrawImage(src, 0, 0); 
     } 

     return newBmp; 
    } 
+0

Obteniendo la excepción de 'falta de memoria' cuando ejecuto este método – talha06

1

La misma conversión se puede hacer utilizando el método de "clon".

Bitmap IndexedImage = new Bitmap(imageFile); 

    Bitmap bitmap = IndexedImage.Clone(new Rectangle(0, 0, IndexedImage.Width, IndexedImage.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
+0

No funciona para disminuir el formato de color (de 32 a 8 bpp) – Pedro77

Cuestiones relacionadas