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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top