Re: 聊聊VB的繪圖效能
感謝 devil 和 StubbornLin 的指導,
以下是我在 MSDN 找到的資料,把它 post 上來供大家參考
'以下範例是將 PictureBox1顯示的圖快速掃描 and 將 RGB 中的 R 全部改為255
Dim myBitmap as Bitmap
'把要掃的圖load進來
myBitmap = Me.PictureBox1.Image
'利用 lockbits 的方法將 myBitmap 的那內容值讀出來
'lock the bitmap's bits
Dim Rec As New Rectangle(0, 0, myBitmap.Width, myBitmap.Height)
Dim Bmd As System.Drawing.Imaging.BitmapData =
myBitmap.LockBits(Rec, Imaging.ImageLockMode.ReadOnly,
myBitmap.PixelFormat)
'上面三行要串在一起
'抓取BMD first line 的記憶體位置
Dim Ptr As IntPtr = Bmd.Scan0
'宣告放圖檔 RGB 顏色值的 RGBArray 大小為 myBitmap的長*寬*3
'影像大小為M by N 的話,記憶體需求量,24bit影像為 M*N*3
'3是因為RGB各要一份,所以 32bit 影像為 M*N*4
Dim bytes As Integer = myBitmap.Width * myBitmap.Height * 3
Dim RGBArray(bytes - 1) As Byte
'Copy the RGB value into RGBArray
System.Runtime.InteropServices.Marshal.Copy(Ptr, RGBArray, 0, bytes)
'!!!! 這裡是示範,把所有R的顏色改為255
For Counter As Integer = 2 To RGBArray.Length - 1 Step 3
RGBArray(Counter) = 255
Next
'Copy the RGB value back to the bitmap
System.Runtime.InteropServices.Marshal.Copy(RGBArray, 0, Ptr, bytes)
'unlock the bits,記憶體鎖起來就要打開
myBitmap.UnlockBits(Bmd)
'把圖貼回去,這裡是因為我在PictureBox 物件載入圖形後即先掃圖的內容
'所以 sub 本身沒有 ByVal e As PaintEventArg
'故而得宣告一個來用
Dim p As New PaintEventArgs(Graphics.FromImage(PictureBox1.Image), Rec)
p.Graphics.DrawImage(myBitmap, 0, 0) '把圖貼回 and 左上角的位置為(0,0)
--
菩提本無樹 明鏡亦非檯
本來無一物 何處惹塵埃
~~~~禪宗六祖慧能
--
◢◣ ︵︵ █▔◣ █▔█ █▔▔ █▔█ █▆▉ █ █▔█ █◣█ █▔●
◢◤█◣◢◣ ︵︵ █ █ █▁◤ █▁▁ █▁█ ▉▉▉ █ █▁█ █◥█ █ █
夢之大地 逼逼ㄟ四 █▁◤ █ █ █▁▁ █ █ ▉▉▉ █▁ █ █ █ █ █▁◤
※ Origin: <bbs.ccns.ncku.edu.tw> ◆ From: 140.116.82.85
討論串 (同標題文章)
完整討論串 (本文為第 4 之 4 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章
-1
12