0

Rgb24 を pixelFormat として持つ WriteableBitmap を変換しようとしています。同じイメージを Bgr 形式の EmguCV イメージに保存したいと考えています。次のコードを書きましたが、適切な結果が得られません。

public unsafe void Convert(WriteableBitmap bitmap)
    {
        byte[] retVal = new byte[bitmap.PixelWidth * bitmap.PixelHeight * 4];
        bitmap.CopyPixels(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight), retVal, bitmap.PixelWidth * 4, 0);

        Bitmap b = new Bitmap(bitmap.PixelWidth, bitmap.PixelHeight);
        int k = 0;
        byte red, green, blue, alpha;
        for (int i = 0; i < bitmap.PixelWidth; i++)
        {                
            for (int j = 0; j < bitmap.PixelHeight && k<retVal.Length; j++)
            {
                alpha = retVal[k++];
                blue = retVal[k++];
                green = retVal[k++];
                red = retVal[k++];

                System.Drawing.Color c = new System.Drawing.Color();
                c = System.Drawing.Color.FromArgb(alpha, red, green, blue);

                b.SetPixel(i, j, c);   
            }
        }
        currentFrame = new Image<Bgr, byte>(b);

        currentFrame.Save("Converted.jpg");
}

前もって感謝します。

4

1 に答える 1

2

このエラーがまだ発生していますか? WriteableBitmap変数からMemoryStreamにデータをダンプし、そこからBitmap変数にデータをダンプすることで、最終的にこれが機能するようになりました。

以下に例を示します: bitmap は WriteableBitmap 変数です。

BitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap);
MemoryStream ms = new MemoryStream();

encoder.Save(ms);
Bitmap b=new Bitmap(ms);
Image<Bgr, Byte> image = new Image<Bgr, Byte>(b);

はるかに遅くなる可能性のあるネストされた for ループを通過する必要がないため、この方法はより良いアプローチだと思います。とにかく、これがうまくいくことを願っています

于 2012-09-02T15:54:07.783 に答える