Re: 聊聊VB的繪圖效能

看板Programming作者時間18年前 (2006/07/29 02:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/4 (看更多)
感謝 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
文章代碼(AID): #14ob3d00 (Programming)
文章代碼(AID): #14ob3d00 (Programming)