我正在打开不同类型的图像,如(8位和16位),它们是(Monocrome,RGB,调色板)。
我有这些图像的原始像素数据。 我为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 :(得分:0)
查看位图的Image.Palette
属性。
答案 1 :(得分:0)
据我所知,.NET不支持ICC颜色配置文件,因此如果您打开使用AdobeRGB颜色配置文件的图像,颜色将显得比您打开时更加暗淡和“灰色”例如,Photoshop或其他颜色配置文件感知软件中的相同图像文件。
This post discusses some color profile issues;你可能会在那里找到一些有趣的东西。
答案 2 :(得分:0)
GetPixel和SetPixel确实很慢。如果您想对单个像素执行操作,请考虑使用FastBitmap。它允许快速着色像素。使用这个不安全的位图将大大提高您的速度。
答案 3 :(得分: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);
感谢
任何人都可以拥有比这更快的代码。