• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發C#.NET → C#圖像處理技巧以及比VB.net的一些優勢

    C#圖像處理技巧以及比VB.net的一些優勢

    相關軟件相關文章發表評論 來源:西西整理時間:2013/6/29 21:11:53字體大?。?em class="fontsize">A-A+

    作者:laviewpbt點擊:62次評論:0次標簽: 圖像處理

    FlashPaper圖像處理軟件v2.2 綠色漢化版
    • 類型:圖像處理大?。?i>4.2M語言:中文 評分:3.9
    • 標簽:
    立即下載

    早期的時候我使用的開發工具是VB6,VB6做圖像處理的速度在我的軟件Imageshop中有所體現,還是算可以的。目前,我已經改用C#來研究圖像算法,C#中有指針,做圖像處理起來效率確實要高不少。今天就我掌握的情況,在對VB.NET的圖像處理做一個簡單的描述。

    首先,還是談談圖像像素時數據獲取方面吧,.net中的圖像相關類基本上都是基于GDI+的,因此,圖像數據的獲取其實也是調用GDI+的一些函數。這個函數就是LockBits,在vb.net中彩色圖像數據的快速獲取 一文中,我們是調用了Marshal.Copy把LockBits鎖定的內存數據拷貝到數據中,然后對數組中的值進行處理。這樣做主要的原因是VB.NET不好直接訪問內存(Marshal.ReadByte之類的函數不適合用于大型的循環中)。

    那么,這就造成了2個不好的事情,第一:在同一時間需要2倍于圖像數據量的內存,第二:內存數據拷貝到數據,以及處理后再把數組的數據拷貝會內存中都是會減低速度的。作為一種改進,我們應該充分利用LockBits的功能。LockBits中的LockMode中有一種模式為ImageLockMode.UserInputBuffer,該模式下需要用戶先申請內存,然后在把圖像數據按照相關格式填充如這個內存中。這樣,就可以先定義個數組,然后把圖像數據填充到這個數組中,就避免了來回拷貝的耗時了,簡單示例代碼如下:

    Dim BmpData As New BitmapData
    Stride = ((Bmp.Width * 3 + 3) And &HFFFFFFFC)
    Dim PixleValue(Stride * Bmp.Height) As Byte
    Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)
    BmpData.Scan0 = Hanlde.AddrOfPinnedObject() '取得字節數組的的第一個元素在內存中的地址,VB.NET沒有了VB6.0的VarPtr函數了
    BmpData.Stride = Stride 'Stide這一個字段也必須實現填充,這個需要按照像素格式來計算大小,必須為4的倍數
    Bmp.LockBits(New Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite Or ImageLockMode.UserInputBuffer, PixelFormat.Format24bppRgb, BmpData)
    Hanlde.Free()

    這種調用模式下,BitmapData對象的Scan0和Stride必須由用戶自行計算,其中Scan0為保存解碼后的數據內存的地址。在VB.NET中獲取數組內存地址的代碼似乎比VB6復雜一些,這一點我也不是特別在行。

    調用上述代碼后,PixleValue就已經保存了圖像的數據了。之后就是對圖像數據進行各種各樣的處理了。比如我們那前一段日子共享的色調均化的代碼為例:

    For Y = 0 To Height - 1
    Speed = Y * Stride ' 定位到每個掃描行的第一個像素,以避免溶于數據的影響
    For X = 0 To Width - 1
    HistGram(PixleValue(Speed)) += 1 ' Blue
    HistGram(PixleValue(Speed + 1)) += 1 ' Green
    HistGram(PixleValue(Speed + 2)) += 1 ' Red
    Speed += 3 ' 移向下一個像素
    Next
    Next
    Num = 0
    For Y = 0 To 255
    Num = Num + HistGram(Y) ' 計算映射表
    Lut(Y) = CByte(Math.Truncate(CSng(Num) / (Width * Height * 3) * 255))
    Next
    For Y = 0 To Height - 1
    Speed = Y * Stride
    For X = 0 To Width - 1
    PixleValue(Speed) = Lut(PixleValue(Speed))
    PixleValue(Speed + 1) = Lut(PixleValue(Speed + 1))
    PixleValue(Speed + 2) = Lut(PixleValue(Speed + 2))
    Speed += 3
    Next
    Next

    執行速度比較:針對上述算法,我們只比較算法的執行部分的耗時。

    測試語言            測試圖像(512*384)耗時      測試圖像(1024*768)耗時    測試圖像(4000*3000)耗時  

           VB.NET                7ms              25ms              178ms

            c# 指針        4ms                                  16ms              100ms

            c# 數組                     5ms                                  24ms              139ms

    上表中可以明顯看出指針在速度上還是有明顯的優勢的,唯一值得注意的是,VB.NET的數組版要比C#的數組版的速度要慢,由于VB.NET中我不知道怎么樣查看其對應的反匯編碼,所以我還不清楚這是為什么。 

    上述三種方案的代碼下載:http://files.cnblogs.com/Imageshop/HistgramEqualize%28VB.NETandCsharp%29.rar

    看來VB.NET確實不是圖像處理方案的首選工具啊。

    作者: laviewpbt 時間: 2013.4.07 聯系QQ: 33184777 轉載請保留本行信息

      圖像處理軟件
      (257)圖像處理軟件
      在學校的時候,圖形圖像處理的學生要學習繪畫和圖像構成等等軟件,西西為大家整理了一些好用的圖像處理軟件大全。圖像處理軟件大全簡介圖像處理軟件是用于處理圖像信息的各種應用軟件的總稱,專業的圖像處理軟件有的系列基于應用的處理管理處理軟件等,還有國內很實用的大眾型軟件彩影,非主流軟件有美圖秀秀,動態圖片處理軟件有,等圖像處理軟件哪個好西西當然是推薦眾所周知的啦,用過的都說好哦,入門也容易,其他美圖秀秀光影...更多>>

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>