2010-05-15 20 views
8

Próbuję ustawić kolor danego piksela obrazu. Oto fragment koduUstawianie koloru piksela pliku 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); 
      } 
     } 

każdym razem, kiedy pojawia się następujący wyjątek:

nieobsługiwany wyjątek: System.InvalidOperationException: SetPixel nie jest obsługiwana w przypadku obrazów o indeksowanych formatów pikseli.

jest wyjątek zarówno dla bmp i jpg plików.

Odpowiedz

6

spróbuj wykonać następujące czynności

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

Jeśli masz „Format8bppIndexed”, a następnie kolor każdego piksela bitmapy jest zastąpiony indeksem do tabeli 256 kolorów . i dlatego każdy piksel jest reprezentowany przez tylko jeden bajt. można uzyskać tablicę kolorów:

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

Musisz przekonwertować obraz z indeksowanego na niezindeksowany. Spróbuj tego kodu, aby przekształcić go:

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

Pierwsze 'z memory' wyjątkiem kiedy uruchomić tę metodę – talha06

1

Ta sama konwersja może być wykonane za pomocą metody „klon”.

Bitmap IndexedImage = new Bitmap(imageFile); 

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

nie działa, aby zmniejszyć format koloru (od 32 do 8bpp) – Pedro77

Powiązane problemy