Есть еще один способ, который намного быстрее и намного удобнее. Если вы посмотрите на конструкторы Bitmap, вы найдете тот, который принимает и IntPtr в качестве последнего параметра. Это IntPtr для хранения данных пикселей. Так как ты это используешь?
Dim imageWidth As Integer = 1920
Dim imageHeight As Integer = 1080
Dim fmt As PixelFormat = PixelFormat.Format32bppRgb
Dim pixelFormatSize As Integer = Image.GetPixelFormatSize(fmt)
Dim stride As Integer = imageWidth * pixelFormatSize
Dim padding = 32 - (stride Mod 32)
If padding < 32 Then stride += padding
Dim pixels((stride \ 32) * imageHeight) As Integer
Dim handle As GCHandle = GCHandle.Alloc(pixels, GCHandleType.Pinned)
Dim addr As IntPtr = Marshal.UnsafeAddrOfPinnedArrayElement(pixels, 0)
Dim bitmap As New Bitmap(imageWidth, imageHeight, stride \ 8, fmt, addr)
Теперь у вас есть простой массив Integer и растровое изображение, ссылающиеся на одну и ту же память. Любые изменения, внесенные вами в массив Integer, будут напрямую влиять на растровое изображение. Давайте попробуем это с помощью простого преобразования яркости.
Public Sub Brightness(ByRef pixels() As Integer, ByVal scale As Single)
Dim r, g, b As Integer
Dim mult As Integer = CInt(1024.0f * scale)
Dim pixel As Integer
For i As Integer = 0 To pixels.Length - 1
pixel = pixels(i)
r = pixel And 255
g = (pixel >> 8) And 255
b = (pixel >> 16) And 255
'brightness calculation
'shift right by 10 <=> divide by 1024
r = (r * mult) >> 10
g = (g * mult) >> 10
b = (b * mult) >> 10
'clamp to between 0 and 255
If r < 0 Then r = 0
If g < 0 Then g = 0
If b < 0 Then b = 0
r = (r And 255)
g = (g And 255)
b = (b And 255)
pixels(i) = r Or (g << 8) Or (b << 16) Or &HFF000000
Next
End Sub
Вы можете заметить, что я использовал небольшой трюк, чтобы избежать математики с плавающей запятой внутри цикла. Это значительно повышает производительность.
И когда вы закончите, вам нужно немного прибраться, конечно ...
addr = IntPtr.Zero
If handle.IsAllocated Then
handle.Free()
handle = Nothing
End If
bitmap.Dispose()
bitmap = Nothing
pixels = Nothing
Я проигнорировал альфа-компонент здесь, но вы также можете использовать его. Таким образом, я собрал много инструментов для редактирования растровых изображений. Это намного быстрее и надежнее, чем Bitmap.LockBits () и, что самое главное, для начала редактирования вашего растрового изображения требуется нулевое копирование.