Hallo Christian vielen Dank
Mit Hilfe des Workshopshttp://www.vbarchiv.net/workshop/workshop97.php
Habe ich das Problem gelöst.
Ich habe mich auf einen Verlauf von Oben nach Unten beschränkt.
Durch Angabe von TopTranzparent kann ich die Anfangs Transparenz festlegen.
Angabe in Prozent
100= Undurchsichtig
0= voll Transparenz
Public Function SetImageAlphaVerlauf(ByVal Image As Bitmap, ByVal _
TopTransparent As Int16) As Image
' Die Funktion demonstriert die direkte Bearbeitung
' der Pixeldaten einer Bilddatei und
' schreibt das Ergebnis in die Datei 'Bilddatei_out'
Dim x, y As Integer ' Loop
Dim Byte_Index As Integer = -4 ' Index im 1D-Array
' Bitmap aus Datei laden
Dim bmp_in As New Drawing.Bitmap(Image)
' Rectangle für die Größe des gesamten
' geladenen Bildes erstellen
Dim bmp_rect As New Drawing.Rectangle(0, 0, bmp_in.Width, bmp_in.Height)
' Eine Arbeits-Bitmap (24-Bit pro Pixel)
' in der erforderlichen Größe erstellen
Dim bmp As New System.Drawing.Bitmap(bmp_in.Width, bmp_in.Height, _
Drawing.Imaging.PixelFormat.Format24bppRgb)
' Liegt bereits eine 24-Bit-Bitmap vor?
If bmp_in.PixelFormat <> Drawing.Imaging.PixelFormat.Format32bppArgb Then
' Ein Zeichnenobjekt für 'bmp' erstellen
Dim mg As Drawing.Graphics = Drawing.Graphics.FromImage(bmp)
' Die geladene Bitmap in 'bmp' neu zeichnen
mg.DrawImage(bmp_in, bmp_rect)
' Zeichnen-Ressourcen freigeben
mg.Dispose()
Else
' Verweis auf geladene Bitmap setzen
bmp = bmp_in.Clone(bmp_rect, bmp_in.PixelFormat)
End If
' Bilddaten (ggf. Ausschnitt) im Speicher sperren
Dim bmp_data As Drawing.Imaging.BitmapData = _
bmp.LockBits(bmp_rect, Drawing.Imaging.ImageLockMode.ReadWrite, _
bmp.PixelFormat)
' Adresse des Beginns der Bitmap-Bilddaten ermitteln
Dim bmp_ptr As IntPtr = bmp_data.Scan0
' Array für Bitmapdaten in geeigneter Größe erstellen
' (24-Bit-Bitmap: 4 Byte / Pixel in Bildbreite)
Dim bmp_bytes As Integer = bmp.Width * bmp.Height * 4
' Null-basiertes Byte-Array (muss eindimensional sein)
' in der erforderlichen Größe vereinbaren
Dim bmp_array(0 To bmp_bytes - 1) As Byte
' Die Bitmapdaten in das Array kopieren
Runtime.InteropServices.Marshal.Copy(bmp_ptr, bmp_array, 0, bmp_bytes)
' Bearbeitungsvektor für Pixel-Bytes erstellen
' =============================================
Dim bearb_vek() As Byte
ReDim bearb_vek(0 To Byte.MaxValue)
' Vektor initialisieren (=kein Effekt)
For x = 0 To Byte.MaxValue
bearb_vek(x) = CByte(x)
Next x
' Die Bilddaten bearbeiten
' (Doppelschleife mit y-x-pixelbezogenem Zugriff
' auf die Daten im Array)
Dim alpha As Double = 0
For y = 1 To bmp.Height
alpha = alpha + (1 / bmp.Height)
For x = 1 To bmp.Width
' Array-Index,
' falls das gesamte Bild bearbeitet wird
Byte_Index += 4
' vier Byte/Pixel an Position x,y modifizieren
' Reihung allerdings je nach Hardware:
' Rot - Grün - Blau oder Blau - Grün - Rot
' Anwendung des Bearbeitungsvektors
' ===================================
bmp_array(Byte_Index) = bearb_vek(bmp_array(Byte_Index))
bmp_array(Byte_Index + 1) = bearb_vek(bmp_array(Byte_Index + 1))
bmp_array(Byte_Index + 2) = bearb_vek(bmp_array(Byte_Index + 2))
'bmp_array(Byte_Index + 3) = bearb_vek(bmp_array(Byte_Index +
' 3))
bmp_array(Byte_Index + 3) = bearb_vek(bmp_array(Byte_Index + 3) _
* (TopTransparent / 100) * alpha) ' Transparenz?
Next x
Next y
' Die modifizierten Arraydaten
' in die Bitmap zurück-kopieren
Runtime.InteropServices.Marshal.Copy(bmp_array, 0, bmp_ptr, bmp_bytes)
' Die gesperrten Bilddaten (ggf. Ausschnitt)
' im Speicher wieder freigeben
bmp.UnlockBits(bmp_data)
Return bmp
End Function Das ganze dauert jetzt nur noch 25 msek. Das reicht mir!
Danke nochmals |