VB 5/6-Tipp 0619: Ein Bild mithilfe der PlgBlt-API drehen
von Daniel Aue
Beschreibung
Dieser Tipp zeigt, wie man mithilfe der PlgBlt-API ein Bild um seine eigenen Achsen drehen kann.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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