2012-11-28 94 views
1

上下文:有沒有辦法在C#中編寫一次性(UnlockBits)位圖?

我和我的同事們通過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這個位圖,但是因爲它是密封的,所以這是不可能的。

此外,編寫擴展方法,如this example將無法​​正常工作,因爲它需要一個靜態類到Be an Extension Handler,這不會以任何方式幫助我們。

問:

也就是說,有沒有我們可以管理,當涉及到「UnlockBits()」方法,寫一個「一次性」的位圖,而無需編寫一個「包裝」什麼辦法?

By Wrapper我的意思是一個類private bitmap attribute,將 複製到位圖屬性調用。這將導致我們再次編寫每個位圖方法 ,並且只需在private屬性上調用具有相同名稱的方法,該屬性就是Meh。

在此先感謝

回答

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

} 
1

編號位圖和BitmapData都是密封的。你不能擴展它們,所以封裝是你處理它的唯一(也是最好的)方法。

相關問題