Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0619: Ein Bild mithilfe der PlgBlt-API drehen

 von 

Beschreibung 

Dieser Tipp zeigt, wie man mithilfe der PlgBlt-API ein Bild um seine eigenen Achsen drehen kann.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

PlgBlt

Download:

Download des Beispielprojektes [24,99 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Horizontale Scrollbar "HScroll4"
' Steuerelement: Horizontale Scrollbar "HScroll3"
' Steuerelement: Horizontale Scrollbar "HScroll2"
' Steuerelement: Bildfeld-Steuerelement "ps"
' Steuerelement: Bildfeld-Steuerelement "pd"
' Steuerelement: Horizontale Scrollbar "HScroll1"
' Steuerelement: Bildfeld-Steuerelement "po"

Option Explicit
'Source von Daniel Aue

Const pi180 = 3.14159265358979 / 180

Private Declare Function PlgBlt Lib "gdi32.dll" ( _
         ByVal hdcDest As Long, _
         lpPoint As POINTAPI, _
         ByVal hdcSrc As Long, _
         ByVal nXSrc As Long, _
         ByVal nYSrc As Long, _
         ByVal nWidth As Long, _
         ByVal nHeight As Long, _
         ByVal hbmMask As Long, _
         ByVal xMask As Long, _
         ByVal yMask As Long) As Long

Private Type POINTAPI
        x As Long
        y As Long
End Type

Dim PtList(2) As POINTAPI

Private Sub Form_Load()
    pd.Picture = LoadPicture(App.Path & "\back.jpg")
    po.Picture = LoadPicture(App.Path & "\back.jpg")
    DoRedraw
End Sub

Private Sub HScroll1_Change()
    DoRedraw
End Sub

Private Sub HScroll2_Change()
    DoRedraw
End Sub

Private Sub HScroll3_Change()
    DoRedraw
End Sub

Private Sub HScroll4_Change()
    DoRedraw
End Sub

Private Sub HScroll1_Scroll()
    DoRedraw
End Sub

Private Sub HScroll2_Scroll()
    DoRedraw
End Sub

Private Sub HScroll3_Scroll()
    DoRedraw
End Sub

Private Sub HScroll4_Scroll()
    DoRedraw
End Sub

Sub DoRedraw()
    Dim x As Integer
    Dim NewX As Integer, NewY As Integer
    Dim SinAng1, CosAng1, SinAng2, SinAng3
    Dim Zoom

    'Punktliste zurücksetzen:
    PtList(0).x = -(ps.ScaleWidth / 2)
    PtList(0).y = -(ps.ScaleHeight / 2)
    PtList(1).x = ps.ScaleWidth / 2
    PtList(1).y = -(ps.ScaleHeight / 2)
    PtList(2).x = -(ps.ScaleWidth / 2)
    PtList(2).y = (ps.ScaleHeight / 2)
    
    'Variablen vorberechnen:
    Zoom = Tan(HScroll4.Value * pi180)
    SinAng1 = Sin((HScroll1.Value + 90) * pi180)
    CosAng1 = Cos((HScroll1.Value + 90) * pi180)
    SinAng2 = Sin((HScroll2.Value + 90) * pi180) * Zoom
    SinAng3 = Sin((HScroll3.Value + 90) * pi180) * Zoom
    
    'Punkte transformieren:
    For x = 0 To 2
        NewX = (PtList(x).x * SinAng1 + PtList(x).y * CosAng1) * SinAng2
        NewY = (PtList(x).y * SinAng1 - PtList(x).x * CosAng1) * SinAng3
        PtList(x).x = NewX + (pd.ScaleWidth / 2)
        PtList(x).y = NewY + (pd.ScaleHeight / 2)
    Next
    
    'alte Darstellung des Back Buffers löschen
    po.Cls
    
    'neue Darstellung in den Backbuffer zeichnen:
    Call PlgBlt(po.hDC, PtList(0), ps.hDC, 0, 0, ps.ScaleWidth, ps.ScaleHeight, 0, 0, 0)
    
    'und in die Anzeige PicBox übernehmen:
    pd.Picture = po.Image
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von cromit am 20.04.2011 um 16:21

Funktion klappt super!

Aber:
Bei 0 , 90 , 180 , 270 und 360 wird das Bild immer verwaschen dargestellt!?
d.h. Haarlinien werden weichgezeichnet dargestellt.
Die Konturen einer Zeichnung werden völlig verwaschen!

Hat jemand eine Idee, an was das liegen könnte.

Vielen Dank.
Gruß
cromit

Kommentar von dem Lama am 09.06.2010 um 20:02

Bei mir klappt das mit der Maske nicht. Wenn ich bei hbmMask einen Wert ungleich Null übergebe so erhalte ich immer den Fehler Überlauf!

Wieso?

Ich übergebe nur das Handle eines StandarPictures in das ich vorher ein monochromes Bild geladen habe.

Was muss ich machen?
Ich übergebe nur das Handle eines StandarPictures in das ich vorher ein monochromes Bild geladen habe.

Kommentar von Felix.S am 21.06.2008 um 18:35

Hallo Daniel,
Darf ich mir das in ein
Shareware-Programm rein-
basteln?

Kommentar von Dominik am 04.02.2007 um 21:37

Hallo,
habs dann doch selbst rausgefunden.
Als hbmMask kann man SandardPicture.Handel angeben, einer monochromen Bitmap. Alle schwarzen Pixel(Wert 0) werden dann nicht gezeichnet, alle weißen (Wert 1) werden gezeichnet. xMask und yMask sind die Quellkoordinaten aus der Bitmap...

Allerdings gibts da noch einen Fehler, wenn man das Bild um 180 Dreht wird die monochrome Maske nicht richtig "Mitgedreht" und es wird nicht richtig Transparent gezeichnet. (Die Maske wird horizontal gespiegelt gezeichnet)

Vielleicht weiß dazu noch jemand einen Rat!?

MFG
Dominik

Kommentar von Dominik am 03.02.2007 um 12:12

Hallo,

Super Funktion dieses Teil, echt Klasse, aber was kann ich mit den folgenden Aufrufen aus der Funktion anfangen?

...
ByVal hbmMask As Long, _
ByVal xMask As Long, _
ByVal yMask As Long)

Kann man damit evtl. Tranzparent zeichnen, und wenn ja wie?

Danke für eine Antwort,
MFG
Dominik

Kommentar von H. Schneller am 07.01.2006 um 12:30

Einfach GENIAL1
DANKE

Kommentar von Timo am 07.12.2004 um 14:24

Super, spitze, irrsinnig! So einfach und schnell wird das umgesetzt? Ich staune. Suche noch den Haken. Danke an Daniel Aue