[VBNET] 圖檔減色運算程式碼

這是我在 VB.NET 將全彩色減色運算到 256 色的部份程式碼:
….
bitmapData = bitmap.LockBits(rect, Drawing.Imaging.ImageLockMode.WriteOnly, Drawing.Imaging.PixelFormat.Format8bppIndexed)
Dim pixels As IntPtr = bitmapData.Scan0
Dim pBits As Int32
Dim bits As Byte()

If (bitmapData.Stride > 0) Then
   pBits = pixels.ToInt32()
Else
   pBits = pixels.ToInt32() + bitmapData.Stride * (Height – 1)
End If

Dim stride As Integer = Math.Abs(bitmapData.Stride)
ReDim bits(Height * stride)

Dim row, col As Integer

Dim arrBitmapArray As Integer() = GetBitmapIntegerArray(BmpCopy)
Dim ipp As Integer
Dim pixel As ColorDim i8BppPixel As Integer
Dim luminance, colorIndex As Double

For ipp = 0 To UBound(arrBitmapArray)
   pixel = Color.FromArgb(arrBitmapArray(ipp))
   luminance = (pixel.R * 0.299) + (pixel.G * 0.587) + (pixel.B * 0.114)
   colorIndex = Math.Round((luminance * (nColors – 1) / 255))
   bits(ipp) = CByte(colorIndex)
Next
CopyMemory(pBits, bits, Height * stride)
bitmap.UnlockBits(bitmapData)
….

Public Function GetBitmapIntegerArray(ByVal oBitmap As Object) As Integer()
   Dim nLen = oBitmap.Width * oBitmap.Height
   Dim hBitmap As IntPtr = oBitmap.GetHbitmap()
   Dim arrBmpArray(nLen – 1) As Integer
   Dim summy As Integer = GetBitmapBits(hBitmap, 4 * nLen, arrBmpArray)
   DeleteObject(hBitmap)
   Return arrBmpArray
End Function

如果只要 GetPixel ,可以直接:
GetBitmapIntegerArray
配上 CopyMemory 也可以轉為 2D 的陣列。


有興趣的可以參考那篇的討論,那篇發問者要問 c# ,所以他有把他的 c# 原始碼改好後放上討論區。

廣告
Categories: 技術分享 | 1 則迴響

文章分頁導航

One thought on “[VBNET] 圖檔減色運算程式碼

發表迴響

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

WordPress.com Logo

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

Twitter picture

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

Facebook照片

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

Google+ photo

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

連結到 %s

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

%d 位部落客按了讚: