 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 10.04.2012, 13:14 Titel: Rotate: PlgBlt(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)? |
|
|
Hallo, wie kann man bitte mit dieser Routine in Freebasic ein Bild drehen?
Darstellen in einem normalen Freebasic-Fenster.
Danke.
Gruss
Code: |
Procedure RotateIm(ImNr.i, wkl.f)
Dim Vert.POINT(2)
wi.i = ImageWidth(ImNr)
hi.i = ImageHeight(ImNr)
; Vert(0) = linke obere Ecke
; Vert(1) = rechte obere Ecke
; Vert(2) = linke untere Ecke der gedrehten Image berechnen
Vert(0)\x = 0
Vert(0)\y = 0
Vert(1)\x = wi * Cos(wkl)
Vert(1)\y = wi * Sin(wkl)
Vert(2)\x = -1 * hi * Sin(wkl)
Vert(2)\y = hi * Cos(wkl)
; Die nächsten 4 If - Bedingungen dienen nur dazu, das die Ecken des Bildes nicht aus den sichtbaren Bereich herausrutschen
If Vert(1)\x < 0
Vert(0)\x = -1 * Vert(1)\x
Vert(2)\x - Vert(1)\x
Vert(1)\x = 0
EndIf
If Vert(2)\x < 0
Vert(0)\x = -1 * Vert(2)\x
Vert(1)\x - Vert(2)\x
Vert(2)\x = 0
EndIf
If Vert(1)\y < 0
Vert(0)\y = -1 * Vert(1)\y
Vert(2)\y - Vert(1)\y
Vert(1)\y = 0
EndIf
If Vert(2)\y < 0
Vert(0)\y = -1 * Vert(2)\y
Vert(1)\y - Vert(2)\y
Vert(2)\y = 0
EndIf
CreateImage(1, 700, 600)
ihdc = StartDrawing(ImageOutput(1))
shdc = CreateCompatibleDC_(ihdc)
obm.i = SelectObject_(shdc, ImageID(0))
PlgBlt_(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)
DeleteDC_(shdc)
StopDrawing()
CopyImage(1, 0)
EndProcedure
|
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4703 Wohnort: ~/
|
Verfasst am: 10.04.2012, 13:49 Titel: |
|
|
Wollte ich auch gerade sagen, war ein bisschen zu langsam  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 11.04.2012, 10:05 Titel: |
|
|
Die von Freebasic ist sehr langsam und die Pixel werden beim Drehen ungenau an den Kannten gesetzt, die Kannten sind Teilweise ausgefranst.
Danke.
Gruss |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.04.2012, 12:36 Titel: |
|
|
Hi,
dir ist doch schon GDI+ zu langsam (http://www.freebasic.net/forum/viewtopic.php?p=171204#p171204) und da glaubst du das die alte PlgBlt schneller ist?
Zudem muss noch jede Menge Beicode für ein FB-Image geprogt werden.
Wenn du viel Langeweile hast mach mal (lernen kann man dabei). _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 12.04.2012, 13:54 Titel: |
|
|
RotateScaleHQ ist mein Favorit:
http://www.freebasic.net/forum/viewtopic.php?f=8&t=14735
Übrigens: Kopieren allein bringt nichts, du musst auch lernen fremden Code zu verstehen und diesen anzuwenden.
Und ganz wichtig beim einbinden von fremden Code: sich nicht für den fremden Code rühmen und ursprüngliche Autorenangabe und Copyright dabei lassen; denn sonst nennt man das Plagiat und das sollte eigentlich bestraft werden. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 12.04.2012, 17:43 Titel: |
|
|
GDI ist ja auch so unfassbar langsam. Geeenau.
Wenn du's schnell haben willst, musst du halt Systeme für Echtzeitdarstellung (OpenGL, DirectX) nehmen. |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 13.04.2012, 15:29 Titel: |
|
|
Mit dem GDI bekommst du keine scharfen Kannten, weil alles dort weich gezeichnet wird. Wenn du bei GDI dann Transparent machst, dann sieht man an den Rändern immer noch die Farbreste der transparenten Farbe.
Gruss |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 21.05.2012, 17:56 Titel: |
|
|
Hallo, guten Tag.
Ich habe mal eine Bitte.
Wer kann mir das mal für ein normaes Freebasicfenster umstellen ohne Timer, nur das die Rotation funktioniert.
Danke.
Gruss
Code: |
#Include "window9.bi"
#Ifndef PI
#define PI 3.14159265358979323846
#EndIf
Declare Sub DrawRotated(DC As HDC, Bitmap As HBITMAP, X As Integer, Y As Integer ,width_ As Integer, height As Integer, Angle As Single )
Declare Sub timerRotate()
Dim Shared As HBITMAP bmp
Dim Shared As hwnd hwnd
Dim Shared angle As Single
hwnd =OpenWindow("Draw",100,100,320,240)
bmp=Create_Image(50,50)
Var hdc = ImageStartDraw(bmp)
BoxDraw(10,10,30,30,255,255)
StopDraw
SetTimer(hwnd,1,1,Cast(TIMERPROC,@timerRotate()))
Do : Loop Until WaitEvent=EventClose
Sub timerRotate()
Var hdc = WindowStartDraw(hwnd)
FillRectDraw( 10 , 10 ,&hf0f0f0 )
angle+=1
DrawRotated(hdc,bmp,130,70,50,50,angle)
StopDraw
End Sub
Sub DrawRotated(DC As HDC, Bitmap As HBITMAP, X As Integer, Y As Integer ,width_ As Integer, height As Integer, Angle As Single )
Dim As HDC TempDC
Dim As SIZE BmpSize
Dim As Single Radians
Dim As Point Points(0 To 2)
Dim As Integer Xc, Yc
TempDC = CreateCompatibleDC(DC)
SelectObject(TempDC, Bitmap)
BmpSize.cx=width_
BmpSize.cy=height
Radians = Angle * Pi / 180
With BmpSize
'find center.
Xc = X + (.cX \ 2)
Yc = Y + (.cY \ 2)
'calc.
Points(0).X = (X - Xc) * Cos(Radians) - (Y - Yc) * Sin(Radians) + Xc
Points(0).Y = (Y - Yc) * Cos(Radians) + (X - Xc) * Sin(Radians) + Yc
Points(1).X = (X + .cX - Xc) * Cos(Radians) - (Y - Yc) * Sin(Radians) + Xc
Points(1).Y = (Y - Yc) * Cos(Radians) + (X + .cX - Xc) * Sin(Radians) + Yc
Points(2).X = (X - Xc) * Cos(Radians) - (Y + .cY - Yc) * Sin(Radians) + Xc
Points(2).Y = (Y + .cY - Yc) * Cos(Radians) + (X - Xc) * Sin(Radians) + Yc
'draw.
PlgBlt(DC, @Points(0), TempDC, 0, 0, .cX, .cY, 0, 0, 0)
DeleteDC(TempDC)
End With
End Sub
|
Zuletzt bearbeitet von arduno am 21.05.2012, 23:52, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.05.2012, 18:37 Titel: |
|
|
Hi,
wodurch soll denn die Rotation ausgelöst werden?? _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 21.05.2012, 23:47 Titel: |
|
|
Hmm..., durch "angle", welches übergeben wird.
Und dann : Radians = Angle * Pi / 180
Oder was meinst du?
Danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 22.05.2012, 01:58 Titel: |
|
|
Code: |
'...
'SetTimer(hwnd,1,1,Cast(TIMERPROC,@timerRotate()))
Do
timerRotate()
sleep 1, 1
Loop 'Until WaitEvent=EventClose
'...
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 22.05.2012, 08:47 Titel: |
|
|
Hmm.., jetzt habe ich die Frage verstanden.
Es soll im normalen Freebasic ohne Timer gehen.
Danke.
Gruss |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|