Bitmap.LockBits 方法的補充說明

原先是回覆這篇的:
 
後來發覺看錯,MSDN 上範例是從 jpeg 圖檔建立 Bitmap ,這位網友是直接建立,但是既然寫了,就把 Bitmap.LockBits 的補充說明撿回來,補充說明直接張貼在:

補充說明直接產生新的 Bitmap 下,不能直接引用此範例 

說明:

在這篇討論中:

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2453889&SiteID=14

網友直接引用此範例,但是對於初始化的圖形略有修改:

' Create a new bitmap.
Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)

網友採用直接建立新的 Bitmap ,並非如本範例採用參照既有 Jpeg 圖檔。Jpeg 圖檔格式僅有 24 bits ,而不同的圖檔格式可能會有不同的色階,例如 bmp/png 可能為 32 bits 的全彩圖或其他不支援透明色的格式,直接引用此範例時,須注意原始圖檔色階。

直接建立新的 Bitmap 時(如上建立程式碼),在未指定 PixelFormat 的情況下,預設為 Format32bppArgb ,亦即顏色的 16 進位值為 &HAARRGGBB ,Windows 的位元組為 little endian byte order 故每 4 bytes 為 Byte(0) = BB, Byte(1) = GG, Byte(2) = RR, Byte(3) = AA ,AA = 0 表示 100% 透明,所以什麼都看不見,AA = 255 表示完全非透明,就是一般的顏色。

故範例程式碼修改要考慮是 4 bytes 。

[VB]

' 宣告應改為 4 Bytes
Dim bytes As Integer = bmp.Width * bmp.Height * 4

For counter As Integer = 3 To rgbValues.Length - 1 Step 4 ' 迴圈應改為 4 Bytes
rgbValues(counter - 1) = 255 ' 設定紅色
rgbValues(counter) = 255 ' 設定透明度為 0
Next

另一種改法是直接處理 4 Bytes 的整數,修改的幅度比較大,但是效能會比分別設定兩個 Bytes 會更快:

Dim pixels As Integer = bmp.Width * bmp.Height ' 計算點數
Dim rgbValues(pixels - 1) As Integer
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, pixels)
For counter As Integer = 0 To rgbValues.Length - 1
rgbValues(counter) = -65536 ' &HFFFF0000,直接設定透明度為 0 及紅色的常數值
Next
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, pixels)

其他語言範例可依此原則調整。

廣告
Categories: 技術分享 | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: