2010-05-15 10 views
8

Ich versuche, eine Farbe des gegebenen Pixels des Bildes zu setzen. Hier ist der Code-SchnipselEinstellen der Pixelfarbe der BMP/JPG-Datei

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

Jedes Mal, wenn ich die folgende Ausnahme erhalten:

Unbehandelte Ausnahme: System.InvalidOperationException: SetPixel ist nicht für Bilder mit indizierten Pixelformaten unterstützt.

Die Ausnahme ausgelöst wird sowohl für bmp und jpg Dateien.

Antwort

6

versuchen Sie die folgenden

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

Wenn Sie bekommen „Format8bppIndexed“ dann wird die Farbe jedes Pixels der Bitmap durch einen Index in eine Tabelle von 256 Farben ersetzt wird . und daher wird jedes Pixel durch nur ein Byte repräsentiert. können Sie eine Reihe von Farben erhalten:

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

Sie müssen das Bild von indiziert in nicht indiziert konvertieren. Versuchen Sie diesen Code zu konvertieren:

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

Beim Speichern dieser Methode wird eine Ausnahme wegen Speichermangel ausgelöst – talha06

1

Die gleiche Umwandlung kann getan werden, „Klon“ Methode.

Bitmap IndexedImage = new Bitmap(imageFile); 

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

Funktioniert nicht, um das Farbformat zu verringern (von 32 auf 8 bpp) – Pedro77