Cómo aplicar color Lut imagen de mapa de bits sobre en c #
Pregunta
Estoy abriendo diferentes tipos de imágenes como (8 y 16 bits) y son (Monocrome, RGB, color de la paleta).
Tengo datos de píxeles primas de estas imágenes. Creo mapa de bits como esto para imágenes de 8 bits.
//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);
El problema es que cuando dibujo esa imagen bmp a continuación, se diferencia en el color que el original. Entonces, ¿hay alguna manera de aplicar LUT (tabla de consulta) en el que las imágenes en color.
quiero ningún código no seguro porque he intentado getixel y setPixel y son muy lentos. También no quiero Image.fromSource () métodos.
Solución 4
He resuelto este problema cómo. En alguna parte leí que GDI + Retorno valor BGR no es el RGB. Así que invertir el orden y sorprendente todo está bien. Pero es poco lento.
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);
gracias
Puede alguien es tener algo de código más rápido que eso.
Otros consejos
Tome un vistazo a Image.Palette
propiedad.
Por lo que yo sé, .NET no admite perfiles de color ICC, por lo que si, por ejemplo, abrir una imagen que está utilizando el perfil de color Adobe RGB, aparecerán los colores un poco más apagado y más "gris" que si se abre el mismo archivo de imagen en, por ejemplo, Photoshop u otro software de color de perfil en cuenta.
Este post se describen algunos problemas de perfil de color ; usted puede encontrar algo de interés allí.
GetPixel y SetPixel son de hecho muy lento. Si desea operar sobre los píxeles individuales, considere el uso de un FastBitmap . Permite a color de forma rápida píxeles. El uso de este mapa de bits inseguros mejorará en gran medida su velocidad.