Hay otra manera que es mucho más rápida y mucho más conveniente. Si echas un vistazo a los constructores de mapas de bits, encontrarás uno que toma e IntPtr como último parámetro. Ese IntPtr es para contener datos de píxeles. Entonces, ¿cómo se usa?
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)
Lo que tiene ahora es una matriz de enteros simple y un mapa de bits que hace referencia a la misma memoria. Cualquier cambio que realice en la matriz de enteros afectará directamente al mapa de bits. Permítanos probar esto con una simple transformación de brillo.
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
Puede notar que he usado un pequeño truco para evitar hacer matemáticas de coma flotante en el ciclo. Esto mejora el rendimiento bastante. Y cuando haya terminado lo que necesita para limpiar un poco claro ...
addr = IntPtr.Zero
If handle.IsAllocated Then
handle.Free()
handle = Nothing
End If
bitmap.Dispose()
bitmap = Nothing
pixels = Nothing
me han ignorado el componente alfa aquí, pero usted es libre de utilizar eso también. He creado muchas herramientas de edición de mapas de bits de esta manera. Es mucho más rápido y más confiable que Bitmap.LockBits() y lo mejor de todo es que requiere cero copias de memoria para comenzar a editar su bitmap.
El siguiente enlace contiene métodos de acceso de píxeles de mapa de bits comparativamente. http://csharpexamples.com/fast-image-processing-c/ – turgay