1

(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

4 に答える 4

0

GetPixel と SetPixel は確かに非常に遅いです。単一のピクセルに対して操作を実行する場合は、FastBitmapの使用を検討してください。ピクセルにすばやく色を付けることができます。この安全でないビットマップを使用すると、速度が大幅に向上します。

于 2009-04-28T13:44:49.733 に答える
0

私はこの問題を解決しました。どこかで、GDI+ が RGB ではなく BGR 値を返すことを読みました。だから私は順序を逆にして、驚くほどすべてうまくいきます。しかし、それは少し遅いです。

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

ありがとう

それよりも速いコードを持っている人はいますか。

于 2009-04-29T10:33:11.807 に答える
0

ビットマップのImage.Paletteプロパティを見てください。

于 2009-04-28T13:33:37.077 に答える
0

私の知る限り、.NET は ICC カラー プロファイルをサポートしていません。そのため、たとえば Adob​​eRGB カラー プロファイルを使用している画像を開くと、同じ画像を開いた場合よりも色が少しくすんで「灰色がかった」ように見えます。たとえば、Photoshop または別のカラー プロファイル対応ソフトウェアでファイルします。

この投稿では、いくつかのカラー プロファイルの問題について説明します。そこに興味のあるものが見つかるかもしれません。

于 2009-04-28T13:39:52.133 に答える