2009-04-28 93 views
1

我打开不同类型的图像(如8位和16位),它们是(Monocrome,RGB,调色板颜色)。如何在C#中的位图图像上应用颜色012

我有这些图像的原始像素数据。 我为8位图像创建这样的位图。

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

的问题是,当我绘制bmp图象然后它不同于在颜色上比原。 那么有什么办法可以将lut(查找表)应用于那些彩色图像上。

我想要任何不安全的代码,因为我尝试了getixel和setPixel,它们非常慢。 我也不想要Image.fromSource()方法。

回答

0

我解决了这个问题,看看如何。 某处我读到GDI +返回BGR值不是RGB。 所以我扭转顺序,惊人的一切都很好。 但它有点慢。

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

感谢

任何人可以是有一些比更快的代码。

0

看看位图的Image.Palette属性。

+0

我看到了,但对于RGB图像Image.palette是0. 我得到Image.Palette = 256的情况下,单色和调色板的彩色图像。 但是对于调色板彩色图像,我怎样才能分别得到RGB字节数组 以及如何应用Image.Palette。 我试过了,但是假设原始图像是绿色的。 而我从我的代码中获取图像颜色紫罗兰色。 那么它会给出原始的绿色,如果我将采取单独的RGB和适用于Image.palette。 谢谢 – prashant 2009-04-29 06:16:30

+0

我不知道你从哪里得到你的源数据,但你应该能够这样写入调色板:bmp.Palette.Entries [0] .r = red_value;等等。ImagePalette是一个“ColorPalette”对象,不仅仅是条目的数量。 – Alnitak 2009-04-29 06:33:41

+0

谢谢, 第一个ColorPalette是密封类,所以你不能从自己的调色板。如果图像没有。 bmp.Palette是一个属性,但不能为此设置直接值。 因为如果bmp.Palette = 0,所以他们没有任何条目。 所以,如果你试图bmp.Palette.Entries [我]给你无限的例外。 如果要设置bmp.Palette.Entries [i] .R是只读属性。 – prashant 2009-04-30 06:18:54

0

据我所知,.NET不支持ICC颜色配置文件,所以如果您打开一个使用AdobeRGB颜色配置文件的图像,颜色将显得有点苍白,比您更“灰暗”例如,在Photoshop或其他颜色配置文件感知软件中打开相同的图像文件。

This post discusses some color profile issues;你可能会在那里找到一些有趣的东西

+0

我得到image.Palette = 256调色板颜色和单色图像。 但我怎样才能反映这些调色板的形象。 由于图像看起来不正确。 – prashant 2009-04-29 08:39:45

0

GetPixel和SetPixel确实很慢。如果您想对单个像素执行操作,请考虑使用FastBitmap。它允许快速为像素着色。使用这个不安全的位图将大大提高你的速度。

相关问题