2

System.Drawing.Bitmap現在、 a を WPFに統合する際に問題が発生していWriteableBitmapます。

Bitmapのto 位置 (X,Y)からコピーしたいWriteableBitmap

次のコードは、私がこれをどのように試みたかを示しています。

BitmapData Data = Bitmap.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
WriteableBitmap.Lock();

//CopyMemory(WriteableBitmap.BackBuffer, Data.Scan0,  ImageBufferSize);

Int32Rect Rect = new Int32Rect(X, Y, Bitmap.Width, Bitmap.Height);
WriteableBitmap.AddDirtyRect(Rect);
Bitmap.UnlockBits(Data);
Bitmap.Dispose();`

どうもありがとう、

ネオクリプト

4

2 に答える 2

2

WritableBitmap.WritePixels を使用します。これにより、アンマネージ コードを使用できなくなります。

BitmapData Data = Bitmap.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height),
    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

try
{    
    WritableBitmap.WritePixels(
        new Int32Rect(0,0,Bitmap.Width, Bitmap.Height),
        Data.Scan0,
        Data.Stride,
        X, Y);
}
finally
{
    Bitmap.UnlockBits(Data);
}

Bitmap.Dispose();
于 2012-02-18T10:50:42.520 に答える
1

BitmapDataと の両方をロックする必要がありWriteableBitmapます。イメージを特定の (x,y) 位置に描画する場合は、描画用のイメージの残りの幅と高さも管理する必要があります。

[DllImport("kernel32.dll",EntryPoint ="RtlMoveMemory")]
public static extern void CopyMemory(IntPtr dest, IntPtr source,int Length);

public void DrawImage(Bitmap bitmap)
{
    BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    try
    {
        writeableBitmap.Lock();
        CopyMemory(writeableBitmap.BackBuffer, data.Scan0,
            (writeableBitmap.BackBufferStride * bitmap.Height));
        writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bitmap.Width, bitmap.Height));
        writeableBitmap.Unlock();
    }
    finally
    {
        bitmap.UnlockBits(data);
        bitmap.Dispose();
    }
}

そしてあなたのコードで:

Bitmap bitmap = new Bitmap("pic.jpg"); // obtain it from anywhere, memory, file, stream ,...

writeableBitmap = new WriteableBitmap(
                        bitmap.Width,
                        bitmap.Height,
                        96,
                        96,
                        PixelFormats.Pbgra32,
                        null);

imageBox.Source = writeableBitmap;

DrawImage(bitmap);

この方法を使用して、29 fps で 1080P クリップをレンダリングすることができました。

于 2013-01-21T06:41:22.403 に答える