1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
Public Class LockBitmap
Private BaseImageWidth As Integer
Private BaseImageHeight As Integer
Private TotalPixels As Integer
Private ImageAddress As IntPtr
Private ImageData As BitmapData
Private ImageBuffer() As Integer
Private baseImage As Bitmap
Public Property Image() As Bitmap
Get
Return baseImage
End Get
Set(ByVal Value As Bitmap)
baseImage = New Bitmap(Value.Width, Value.Height, Value.PixelFormat)
Dim gr As Graphics
gr = Graphics.FromImage(baseImage)
gr.DrawImage(Value, 0, 0, Value.Width, Value.Height)
gr.Dispose()
End Set
End Property
Private Sub LockTheImage()
' ----- verrouillage de l'image en memoire
BaseImageWidth = baseImage.Width
BaseImageHeight = baseImage.Height
TotalPixels = BaseImageWidth * BaseImageHeight
' ----- Crée un buffer en memoire.
' pour stocker une image au format pixel 32 bit ARVB.
' le format pixel 32 bit ARVB necessite 4 octets
' d'ou un buffer d'Integer car Integer exige 4 octets).
ReDim ImageBuffer(TotalPixels - 1)
' ----- verrouille l'image en memoire
ImageData = baseImage.LockBits(
New Rectangle(0, 0, BaseImageWidth,
BaseImageHeight), ImageLockMode.ReadWrite,
PixelFormat.Format32bppRgb)
'lit l'adresse du 1er pixel ARGB
ImageAddress = ImageData.Scan0
' ----- associe le buffer & l'image verrouille en memory.
Marshal.Copy(ImageAddress, ImageBuffer, 0, TotalPixels)
End Sub
Private Sub UnlockTheImage()
' ----- recopie le buffer d'entiers dans le image.
Marshal.Copy(ImageBuffer, 0, ImageAddress, TotalPixels)
' ----- deverouille l'image en memoire.
Image.UnlockBits(ImageData)
ImageData = Nothing
ReDim ImageBuffer(0)
End Sub
Public Sub BlendColor()
Dim pixelIndex As Integer
Dim onePixel As Integer
Dim alpha As Integer
Dim red As Integer
Dim green As Integer
Dim blue As Integer
Dim y As Integer
Dim x As Integer
' ----- Lock the image for speed.
LockTheImage()
For y = 0 To BaseImageHeight - 1
For x = 0 To BaseImageWidth - 1
pixelIndex = y * BaseImageWidth + x
onePixel = ImageBuffer(pixelIndex)
' ----- Extrait les composantes A,R,G,B.
alpha = (onePixel >> 24) And &HFF
red = (onePixel >> 16) And &HFF
green = (onePixel >> 8) And &HFF
blue = onePixel And &HFF
' ----- TON EXEMPLE DE CALCUL TRADUIT.
'Case BlendMode.Ecran
' R = Max(0, Min(255, 255 - (255 - col1.Color.R) * (255 - col2.Color.R) / 255))
' G = Max(0, Min(255, 255 - (255 - col1.Color.G) * (255 - col2.Color.G) / 255))
' B = Max(0, Min(255, 255 - (255 - col1.Color.B) * (255 - col2.Color.B) / 255))
'BlendColor = CColor.FromRGB(R, G, B)
red = Math.Max(0, Math.Min(255, 255 - (255 - red) * (255 - red) / 255))
green = Math.Max(0, Math.Min(255, 255 - (255 - green) * (255 - green) / 255))
blue = Math.Max(0, Math.Min(255, 255 - (255 - blue) * (255 - blue) / 255))
' ----- met le pixel à la nouvelle color.
' ----- conserve le canal Alpha original .
ImageBuffer(pixelIndex) = (alpha << 24) + _
(red << 16) + (green << 8) + blue
Next x
Next y
' ----- Finished. Unlock the image.
UnlockTheImage()
End Sub
End Class |
Partager