[VB] Bild mit Antialiasing - API AlphaBlend in VB

Zappa1

Cadet 1st Year
Registriert
Sep. 2001
Beiträge
15
Bild mit Antialiasing - API AlphaBlend in VB

Hi Folks!

Ich hab ein Problem mir der API-Funktion AlphaBlend!

Ich möchte auf ein beliebiges Bild ein anderes Bild mit Antialiasing (oder einem transparenten Verlauf) aufbringen. Dazu benötige ich, wie in Photohsop, einen Alphakanal, um die Transparenz des jeweiligen Pixels festzulegen. Da BMP nur 24 Bit und nicht 32 Bit kann, muss ich das in VB in 2 verschiedene Bilder aufteilen: Fill und Mask.

Ok. Nun hab ich in 2 Pictureboxen das Fill- bzw Maskbild geladen. in der 3. Picturebox das Hintergrundbild. Aber wie füge ich das wieder zusammen, damitt die Funktion AlphaBlend das auch als AC_SRC_ALPHA in 32 Bit schluckt???

Kann mir einer einen Link, einen Tipp geben oder am besten ein kl. Beispielprog, wo das schon funktioniert. Damitt müsste es ja dann auch möglich sein, z. B. ein Logo oder eine Schrift auf einen Belibigen Hintrgrund ein- und auszublenden.

Vielen Dank erstmal! Ich freu mich auf Antwort.

Zappa
 
Rumsuchen hat auch nix gebracht... Kann mir nicht Vorstellen, das noch nimand dieses Problem hatte!

Ich möcht nochmal an einem Beispiel verdeutlichen, was ich benötige:

Ich mache eine Glasskugel in Photoshop. Diese ist z.B. in der Mitte Transparenter als außen. Wenn ich diese in PS auf ein Bild lege, sehe ich in der Mitte mehr vom Hintergrund durch als außen. Diese Transparenzinformation jedes Pixels wird durch wird ja durch einen 8-Bit Alphakanal definiert (nicht zu verwechslen mit einer 1-Bit Maske). Dies entspricht einem Graustufenbild.
So hab ich nun 24-Bit Farbinformation für die Glasskugel, und 8-Bit "Graustufen" für die Transparenz.
Dies kann ich in BMP unterbringen. Und so hab ich nun meine 2 Bilder Fill und Mask, die ich halt auch getrennt lade.

Ich möchte also mit dem Programm die Glaskugel über einen Hintergrund bewegen. in Echtzeit!

Vielleicht mir ja doch jemand helfen.

MfG

Zappa
 
wie wär's wenn du pixelweise den rgb-wert des hintergrundes mit dem prozentualen grauwert der alpha-maske multiplizierst? dann würden doch die ränder abgedunkelt und die mitte aufgehellt werden... oder?

bespiel:

pixel gelb (255,255,0)
alpha undurchsitig (0)
=> pixel neu (0,0,0) => schwarz

pixel gelb (255,255,0)
alpha halbtransparent (128)
=> pixel neu (128,128,0) => dunkelgelb

pixel orange (255,128,0)
alpha halbtransparent (128)
=> pixel neu (128,64,0) => dunkelorange

.
.
.

hth
 
Ja, danke, das ist wahr.
Aber ish vergaß zu erwähnen, das ich das in Realtime brauche.... Animation. Und ich will auch nicht eine Assembler- oder C-DLL schreiben oder benutzen.

Zappa
 
echtzeitgrafik in vb ... hmm .. schwerer fall. ich halt weiter die augen und ohren offen, wenn ich was gefunden hab poste ich's!
 
schau mal ob dir das hier weiterhilft ...

Code:
'This project requires two picture boxes
'Both picture boxes should contain a picture
Const AC_SRC_OVER = &H00
Private Type BLENDFUNCTION
  BlendOp As Byte
  BlendFlags As Byte
  SourceConstantAlpha As Byte
  AlphaFormat As Byte
End Type
Private Declare Function AlphaBlend Lib "msimg32.dll" (ByVal hdc As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal hdc As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal lInt As Long, ByVal BLENDFUNCT As Long) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: [url]http://www.allapi.net/[/url]
    'E-Mail: [email]KPDTeam@Allapi.net[/email]
    Dim BF As BLENDFUNCTION, lBF As Long
    'Set the graphics mode to persistent
    Picture1.AutoRedraw = True
    Picture2.AutoRedraw = True
    'API uses pixels
    Picture1.ScaleMode = vbPixels
    Picture2.ScaleMode = vbPixels
    'set the parameters
    With BF
        .BlendOp = AC_SRC_OVER
        .BlendFlags = 0
        .SourceConstantAlpha = 128
        .AlphaFormat = 0
    End With
    'copy the BLENDFUNCTION-structure to a Long
    RtlMoveMemory lBF, BF, 4
    'AlphaBlend the picture from Picture1 over the picture of Picture2
    AlphaBlend Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, lBF
End Sub

(entnommen aus APIGuide 3.6, (c) http://www.AllAPI.net/)
 
Zurück
Oben