none
請問關於繪圖速度的問題 RRS feed

  • 問題

  • 我有一個 bitmap 的 byte() data, 在我的 pc 上, 做了以下三個測試, 各畫 1000 次,

    1.
      (1), 用 new bitmap(new memorystream(data()))
      (2), 用 picturebox.creategraphics.drawimage 把這張 bitmap 畫上去
      (3), 重覆 (1)(2) 1000 次
    2.
      (1), 宣告 1 個 bitmap ,
      (2), 用 lockbits 把 data() copy 到 scan0, 再 unlockbits
      (3), 用 picturebox.creategraphics.drawimage 把這張 bitmap 畫上去
      (4), 重覆 (2)(3) 1000 次
    3.
      (1), 用 c/c++ 呼叫 vfw32.lib 的 stretchdib 取得 stretch 後的 bitmap byte() data,
      (2), 由 picturebox.handle 去 getdc , 再用 setdibtodevice 畫到 dc 上,
      (3), 重覆 (1)(2) 1000 次

    花費時間: 1. 約 42 秒, 2. 約 28 秒, 3. 約 17 秒

    我在 vb.net 中, 找不到可以使用 stretchdib 的方法 (不知道有沒有 dll 可以引用),
    請教各位大大, 在 vb.net 中是否有像第 3 種方式這樣速度的繪圖方式? 謝謝
    2009年2月24日 下午 05:56

解答

所有回覆

  • vfw32.lib 對應到 msvfw32.dll
    所以你可以透過 API 呼叫。
    • 已標示為解答 LonghairPan 2009年2月25日 上午 03:17
    2009年2月25日 上午 01:03
  • HI

    您可以用C/C++寫好繪製的功能, 再用VB.NET去呼叫(使用DllImport), 這樣比較快, 因為圖形/影像處理是C/C++的專長, DllImport的用法可以參考:
    http://www.freevbcode.com/ShowCode.Asp?ID=2707

    tihs
    • 已標示為解答 LonghairPan 2009年2月26日 上午 02:24
    2009年2月25日 上午 02:08
  • 謝謝大大們的回覆, 我想再請問一下,
    一樣跑這兩個 api , 在 c/c++ 做成 dll , 再由 .net import 進來,
    跟在.net 中使用, 我已經把 getdc ... 等, 都簡化抽到迴圈外做,
    單純用迴圈畫 1000 張圖, 但速度上還是 c/c++ 做成的 dll 快,
    請問是否在 .net 中呼叫 winapi 的效能比 c/c++ 來得差?
    或是 dllimport 時有什麼要注意的地方嗎? 謝謝
    2009年2月25日 下午 02:56
  • .Net 呼叫 unmanaged 每次都要做一次變數封裝遞送,一來一回,所以這樣快不起來。

    c 直接做本身變數型態不變,就省了不少事。
    • 已標示為解答 LonghairPan 2009年2月26日 上午 02:24
    2009年2月25日 下午 03:20
  • 這是呼叫次數的問題, 在 c/c++ 做成 dll , 再由 .net import 進來使用只要呼叫一次就好, 當然會快

    tihs
    • 已標示為解答 LonghairPan 2009年2月26日 上午 02:24
    2009年2月26日 上午 01:59