Image drehen?
Image drehen?
Mein DrawImage-Problem wurde super gelöst - aber jetzt stoße ich auf ein anderes Problem:
Wie kann ich ein Image um 90 Grad drehen? Ich kann keinen entsprechenden Befehl finden - nur im Sprite-Bereich, aber dort bion ich anscheinend auf bestimmte Größen beschränkt.
Gibt es für normale Bilder eine Rotate-Funktion?
Wie kann ich ein Image um 90 Grad drehen? Ich kann keinen entsprechenden Befehl finden - nur im Sprite-Bereich, aber dort bion ich anscheinend auf bestimmte Größen beschränkt.
Gibt es für normale Bilder eine Rotate-Funktion?
-
- Beiträge: 167
- Registriert: 29.12.2005 09:58
- Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)
Re: Image drehen?
Für Images gibt es keine Rotate-Funktion. Was hast du denn vor? In Spielen, die sowieso die Sprite-Library verwenden würde ich RotateSprite3D() verwenden. Die Größenvorgaben stören da eigentlich nicht weiter, du nimmst einfach die nächst größere Abmessung für dein Image und machst den Rest transparent.
Wenn du ein Image allerdings nur in 90° Schritten drehen willst, dann kannst du dir dafür doch schnell selber ne Procedure schreiben mit Point(), Plot(), usw.
Wenn du ein Image allerdings nur in 90° Schritten drehen willst, dann kannst du dir dafür doch schnell selber ne Procedure schreiben mit Point(), Plot(), usw.
WinXP 32 Bit, PureBasic 4.40 (x86)
Re: Image drehen?
zum drehen im rechten winkel:
zum rotieren in beliebigem winkel hab ich sonst auch was da, falls du das brauchst.
Code: Alles auswählen
Procedure rotateImage90(image)
If IsImage(image)
Protected i.l, k.l
Protected w=ImageWidth(image)-1
Protected h=ImageHeight(image)-1
Protected Dim p(w,h)
StartDrawing( ImageOutput(image) )
For k=0 To h
For i=0 To w
p(i,k)=Point(i,k)
Next
Next
StopDrawing()
If w<>h
Swap w,h
CreateImage(image,w+1,h+1)
EndIf
StartDrawing( ImageOutput(image) )
For k=0 To h
For i=0 To w
Plot(i,k, p(k,w-i))
Next
Next
StopDrawing()
ProcedureReturn
EndIf
EndProcedure
ww=800
wh=600
style | #PB_Window_ScreenCentered
style | #PB_Window_SystemMenu
style | #PB_Window_MinimizeGadget
hWin=OpenWindow(0, 50,100,ww,wh, "PRESS RETURN TO ROTATE",style)
ImageGadget(0,100,100,0,0,0)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,10)
AddKeyboardShortcut(0,#PB_Shortcut_Return,11)
CreateImage(0,123,321)
StartDrawing(ImageOutput(0))
Box(0,0,999,999,$004400)
Line(0,0,123,321,$0000ff)
Circle(30,10,6,$990000)
StopDrawing()
SetGadgetState(0,ImageID(0))
Repeat
event=WaitWindowEvent(30)
em=EventMenu()
Select event
Case #PB_Event_CloseWindow
quit=1
Case #PB_Event_Menu
Select em
Case 10
quit=1
Case 11
rotateImage90(0)
SetGadgetState(0,ImageID(0))
EndSelect
EndSelect
Until quit
Re: Image drehen?
Vielen Dank für die Antworten und vor allem für die Routine, die ich gleich ausprobieren werde!
Es geht um die automatisierte Erstellung von Visitenkarten mit Fotos, wobei die Fotos alle 90 Grad gedreht von der Kamera kommen.
Ich habe das gestern Nacht mit IrfanView gelöst, den ich einfach über den Folder mit den Bildern habe laufen lassen. Hat natürlich auch funktioniert, aber das ganze gleich im Code zu erledigen, wär eleganter und würde einen Schritt sparen.
Es geht um die automatisierte Erstellung von Visitenkarten mit Fotos, wobei die Fotos alle 90 Grad gedreht von der Kamera kommen.
Ich habe das gestern Nacht mit IrfanView gelöst, den ich einfach über den Folder mit den Bildern habe laufen lassen. Hat natürlich auch funktioniert, aber das ganze gleich im Code zu erledigen, wär eleganter und würde einen Schritt sparen.
-
- Beiträge: 167
- Registriert: 29.12.2005 09:58
- Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)
Re: Image drehen?
Code: Alles auswählen
If w<>h
Swap w,h
CreateImage(image,w+1,h+1)
EndIf
StartDrawing( ImageOutput(image) )
For k=0 To h
For i=0 To w
Code: Alles auswählen
If w<>h
Swap w,h
CreateImage(image,w,h)
EndIf
StartDrawing( ImageOutput(image) )
For k=0 To h-1
For i=0 To w-1
Wenn das Bild 50 Pixel breit ist, dann sind die gültigen X-Koordinaten 0-49

WinXP 32 Bit, PureBasic 4.40 (x86)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Image drehen?
Rokur hat geschrieben:Bei jedem Drehen wird das Image dadurch 1 Pixel in breiter und höher

... erst lesen, dann basteln.#NULL hat geschrieben:Code: Alles auswählen
Protected w=ImageWidth(image)-1 Protected h=ImageHeight(image)-1
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Image drehen?
Code: Alles auswählen
Procedure rotateImage90(image)
If IsImage(image)
Protected i.l, k.l
Protected w=ImageWidth(image)-1
Protected h=ImageHeight(image)-1
Protected Dim p(w,h)
StartDrawing( ImageOutput(image) )
For k=0 To h
For i=0 To w
p(i,k)=Point(i,k)
Next
Next
StopDrawing()
If w<>h
Swap w,h
CreateImage(image,w+1,h+1)
EndIf
StartDrawing( ImageOutput(image) )
For k=0 To h
For i=0 To w
Plot(i,k, p(k,w-i))
Next
Next
StopDrawing()
ProcedureReturn
EndIf
EndProcedure
Bzgl. Plot() -> Lieber den DrawingBuffer direkt ansprechen, den DrawingBufferPitch mit einbeziehen und dann via While/Wend Routine in den Buffer des neuen Images schreiben.
In der Avisynth Library gibt es fantastische mmx/SSE Routinen für eben solch eine Bildbearbeitung, diese könnte man klasse zu PB hin portieren (ASM KnowHow Vorausgesetzt, denn die ASM Routinen dort sind in nASM verfasst), oder man macht eben aus jenen Parts eine .lib die man mit einem Include anbieten könnte.
Wermutstropfen ist aber, dass alles in Avsiynth GPL ist und man somit eine für nicht jeden Zweck optimale Lizenz aufgedrückt bekommt.
Oder ... man sucht im www nach solchen Routinen (Bicubic, Bilinear, Lanczos) die eine MIT oder was auch immer Lizenz besitzen.
Hier gibts die OOP Option für PureBasic.
-
- Beiträge: 167
- Registriert: 29.12.2005 09:58
- Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)
Re: Image drehen?
Ups, hast ja recht.Kaeru Gaman hat geschrieben:... erst lesen, dann basteln.

War nur etwas verwirrend, wenn Variablen, welche offensichtlich die Höhe und Breite eines Images darstellen sollen den bereits um 1 reduzierten Wert enthalten.
WinXP 32 Bit, PureBasic 4.40 (x86)
Re: Image drehen?
Mithilfe der Forensuche hätte man auch diesen Code im Codearchiv
gefunden, der auch Bilder drehen kann.
gefunden, der auch Bilder drehen kann.
Win11 x64 | PB 6.20
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Image drehen?
Eine Lösung der ganz anderen Art wäre, man besitzt einen TFT mit Pivot Funktion
und dreht einfach den Bildschirm
und dreht einfach den Bildschirm
