2009-04-28 12 views
1

Ich öffne verschiedene Arten von Bildern wie (8 und 16 Bit) und sie sind (Monocrome, RGB, Palettenfarbe).Wie anwenden Color Lut über Bitmap-Bild in C#

Ich habe rohe Pixeldaten dieser Bilder. Ich erstelle eine Bitmap wie diese für 8-Bit-Bilder.

  //for monocrome images i am passing PixelFormat.Format8bppIndexed. 
      //for RGB images i am passing PixelFormat.Format24bppRgb 
      PixelFormat format = PixelFormat.Format8bppIndexed; 
      Bitmap bmp = new Bitmap(Img_Width, Img_Height,format); 

      Rectangle rect = new Rectangle(0, 0, Img_Width, Img_Height); 

      //locking the bitmap on memory 
      BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, format); 

      // copy the managed byte array to the bitmap's image data 
      Marshal.Copy(rawPixel, 0, bmpData.Scan0, rawPixel.Length); 
      bmp.UnlockBits(bmpData); 

Das Problem ist, dass, wenn ich, dass BMP-Bild zeichnen dann unterscheidet sie sich in der Farbe als Original. Also gibt es eine Möglichkeit, lut (Lookup-Tabelle) auf diese farbigen Bilder anzuwenden.

Ich möchte jeden unsicheren Code, weil ich versucht habe, getixel und setPixel und sie sind sehr langsam. Ich möchte auch nicht Image.fromSource() -Methoden.

Antwort

0

ich löste dieses Problem sehen, wie. Irgendwo habe ich gelesen, dass GDI + BGR-Wert nicht die RGB zurückgeben. Also ich die Reihenfolge umkehren und alles gut in Ordnung. Aber es ist ein bisschen langsam.

 PixelFormat format = PixelFormat.Format8bppIndexed; 
     Bitmap bmp = new Bitmap(Img_Width, Img_Height,format); 

     Rectangle rect = new Rectangle(0, 0, Img_Width, Img_Height); 

     //locking the bitmap on memory 
     BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, format); 
     Marshal.Copy(rawPixel, 0, bmpData.Scan0, rawPixel.Length); 

     int stride = bmpData.Stride; 
     System.IntPtr Scan0 = bmpData.Scan0; 

     unsafe 
     { 
      byte* p = (byte*)(void*)Scan0; 
      int nOffset = stride - bmp.Width * SAMPLES_PER_PIXEL ; 
      byte red, green, blue; 

      for (int y = 0; y < bmp.Height; ++y) 
      { 
       for (int x = 0; x < bmp.Width; ++x) 
       { 
        blue = p[0]; 
        green = p[1]; 
        red = p[2]; 
        p[0] = red; 
        p[1] = green; 
        p[2] = blue; 
        p += 3; 
       } 
       p += nOffset; 
      } 
     } 

     ////unlockimg the bitmap 
     bmp.UnlockBits(bmpData); 

dank

Can mit jemand etwas schnelleren Code als das.

+0

Hallo, Auch es funktioniert nur für RGB-Bilder. Weil RGB-Bilder mit allen drei Komponenten (R, G, B). Was ist mit PaletteColor Bilder. Ich kann die Farbindizierung in Palettenbildern nicht verstehen. Handelt jemand Farbpalette Farbbilder. – prashant

0

Werfen Sie einen Blick auf die Eigenschaft Image.Palette der Bitmap.

+0

Ich sah, dass aber für RGB-Bilder Image.palette 0 ist. Ich bekomme Image.Palette = 256 im Falle von Monochrom und Palette Farbbilder. Aber für Palette Farbbilder wie bekomme ich RGB-Byte-Array separat und wie man auf Image.Palette anwenden. Ich habe das versucht, aber angenommen, Originalbild ist in grüner Farbe. Und ich bekomme Bildfarbe violett aus meinem Code. So gibt es original grüne Farbe, wenn ich separate RGB nehmen und auf Image.palette anwenden werde. Danke – prashant

+0

Ich weiß nicht, woher Sie Ihre Quelldaten erhalten, aber Sie sollten _write_ auf die Palette so schreiben können: bmp.Palette.Entries [0] .r = red_value; etc. ImagePalette ist ein "ColorPalette" -Objekt, nicht nur die Anzahl der Einträge. – Alnitak

+0

danke, ersten ColorPalette ist versiegelte Klasse, so dass Sie nicht Palette von eigenen machen können.Wenn Bild nicht hat. bmp.Palette ist eine Eigenschaft. Aber Sie können keine direkten Werte darauf setzen. Weil, wenn bmp.Palette = 0, so ist es keine Einträge. Also, wenn Sie versuchen, bmp.Palette.Entries [i] geben Sie außerhalb der Ausnahme gebunden. Und wenn Sie bmp.Palette.Entries [i] .R ist eine schreibgeschützte Eigenschaft. – prashant

0

Soweit ich weiß, unterstützt .NET keine ICC-Farbprofile. Wenn Sie also zum Beispiel ein Bild öffnen, das das AdobeRGB-Farbprofil verwendet, erscheinen die Farben etwas matter und "gräulicher" als bei Ihnen Öffnen Sie die gleiche Bilddatei beispielsweise in Photoshop oder einer anderen Software, die das Farbprofil unterstützt.

This post discusses some color profile issues; Sie können dort etwas von Interesse finden.

+0

Ich erhalte image.Palette = 256 für Farb- und Monochrombilder. Aber wie kann ich diese Palette zum Bild reflektieren. Da das Bild falsch aussieht. – prashant

0

GetPixel und SetPixel sind in der Tat sehr langsam. Wenn Sie Operationen mit einzelnen Pixeln ausführen möchten, sollten Sie eine FastBitmap verwenden. Es erlaubt, schnell Pixel zu färben. Die Verwendung dieser unsicheren Bitmap verbessert Ihre Geschwindigkeit erheblich.

+0

das ist etwas, was ich will. Lets versuchen .. – prashant

+0

Link ist kaputt. – denver