Как применить Color Lut к растровому изображению в c # - PullRequest
2 голосов
/ 28 апреля 2009

Я открываю различные типы изображений, такие как (8 и 16 бит), и они (Монокром, 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 ().

Ответы [ 4 ]

0 голосов
/ 29 апреля 2009

я решил эту проблему, посмотри как. Где-то я читал, что 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 голосов
/ 28 апреля 2009

Насколько я знаю, .NET не поддерживает цветовые профили ICC, поэтому, если вы, например, откроете изображение, использующее цветовой профиль AdobeRGB, цвета будут выглядеть немного более тусклыми и более "серыми", чем при открытии тот же файл изображения, скажем, в Photoshop или другом программном обеспечении с поддержкой цветовых профилей.

В этом посте обсуждаются некоторые проблемы цветового профиля ; Вы можете найти что-то интересное там.

0 голосов
/ 28 апреля 2009

GetPixel и SetPixel действительно очень медленные. Если вы хотите выполнять операции с отдельными пикселями, рассмотрите возможность использования FastBitmap . Это позволяет быстро окрашивать пиксели. Использование этого небезопасного растрового изображения значительно улучшит вашу скорость.

0 голосов
/ 28 апреля 2009

Взгляните на свойство Image.Palette растрового изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...