1

コンテクスト:

私と私の同僚は、C#を介してビットマップ画像を処理する多くの作業を行っています。

現在、画像を管理するためにAForge Frameworkも使用しています。また、AForge dllのメソッドはUnmanagedImageクラスで機能するため、ライブラリの使用を開始する前に、常にビットマップをUnmanagedImageに変換する必要があります。

単純なコード:

これは、通常、ビットマップをUnmanagedImageクラスに変換する方法です。

        BitmapData bmpData;
        Bitmap bmp =  AForgeImaging.SetTo24BitsPerPixel(bmp);
        bmpData    = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);

        UnmanagedImage unmanaged = new UnmanagedImage(bmpData);

問題は、例外を回避するために、常に次のようなことをしなければならないことです。

      try
        {
            // Create Unmanaged Image
            // Process the Image And Stuff
        }
        finally
        {
           // Unlock BitmapBits
        }

私たちの目標:

try/finallyこのステートメントですべてのコードを囲む必要はありません。

それを機能させるためにこれにアプローチする方法はありますか?

ビットマップを試しましExtendたが、封印されているため不可能です。

また、この例のような拡張メソッドを作成することは、静的クラスを必要とするため機能せBe an Extension Handlerず、これはまったく役に立ちません。

質問:

そうは言っても、「ラッパー」を書かなくても、「UnlockBits()」メソッドに関して「使い捨て」ビットマップを書くことができる方法はありますか?

ラッパーとprivate bitmap attributeは、ビットマップ属性への呼び出しを複製するクラスを意味します。これにより、すべてのビットマップメソッドを再度記述し、プライベート属性で同じ名前のメソッドを呼び出すだけになります。これは一種のMehです。

前もって感謝します

4

2 に答える 2

4

以下のようなことを行うことができ、不足しているプロパティを追加するScan0などして、それらを使用する既存のコードを変更する必要はありません。

using System;
using System.Drawing;
using System.Drawing.Imaging;
static class Program
{

    static void Main()
    {

        Bitmap bmp = new Bitmap(100, 100);

        using (var bmpData = bmp.SmartLock(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat))
        {
            // use Scan0 etc as normal
        }
    }
}
static class BitmapUtils
{
    public static WrappedBitmapData SmartLock(this Bitmap bitmap, Rectangle rect, ImageLockMode flags, PixelFormat format)
    {
        return new WrappedBitmapData(bitmap, bitmap.LockBits(rect, flags, format));
    }
    public class WrappedBitmapData : IDisposable
    {
        public int Height { get { return data.Height; } }
        public int Width { get { return data.Width; } }
        public IntPtr Scan0 { get { return data.Scan0; } }
        public PixelFormat PixelFormat { get { return data.PixelFormat; } }
        // etc here ^^^ TODO
        internal WrappedBitmapData(Bitmap bmp, BitmapData data)
        {
            this.bmp = bmp;
            this.data = data;
        }
        private Bitmap bmp;
        private BitmapData data;
        public void Dispose()
        {
            if (data != null && bmp != null)
            {
                bmp.UnlockBits(data);
            }
            data = null;
            bmp = null;
        }
    }

}
于 2012-11-28T14:44:12.520 に答える
1

いいえ。BitmapとBitmapDataは両方とも封印されています。それらを拡張することはできないので、ラッパーがそれを処理する唯一の(そして最良の)方法です。

于 2012-11-28T14:31:50.323 に答える