Grafik drehen [Erledigt]
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Grafik drehen [Erledigt]
Moin,
gibt es irgend eine Möglichkeit, mit Xbase++- oder Windows-Bordmitteln eine bestehende jpg zu drehen? Ich brauch da nichts exotisches, einfach nur 90° (oder 270°, je nachdem wie man die Drehrichtung sieht).
Jan
gibt es irgend eine Möglichkeit, mit Xbase++- oder Windows-Bordmitteln eine bestehende jpg zu drehen? Ich brauch da nichts exotisches, einfach nur 90° (oder 270°, je nachdem wie man die Drehrichtung sieht).
Jan
Zuletzt geändert von Jan am Mi, 09. Apr 2025 7:02, insgesamt 1-mal geändert.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- nightcrawler
- 1000 working lines a day
- Beiträge: 705
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 118 Mal
- Kontaktdaten:
Re: Grafik drehen
nicht direkt in Xbase++, aber evl. kann eine DLL mit https://de.wikipedia.org/wiki/Libjpeg erstellt/eingebunden werden.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Hallo, Jan.
Das geht mit Bordmitteln m.E. nicht, jedenfalls nicht ohne Einbindung einer ActiveX-Komponente (auf diesem Weg machen wir das). Es gibt eine GDI-Funktion "RotateBitmap", die das kann, aber die erfordert GDI+, und das wollten sie in Xbase++ nicht mehr einbauen, weil ja die flächige Unterstützung hochmodernster HTML-Komponenten viel besser wäre, wenn es sie gäbe.
Es gibt ein OpenSource-Tool, das Du über die Kommandozeile aufrufen kannst, es heißt "Magick" (https://imagemagick.org/). Der Kommandozeilenaufruf zur Rotation und Speicherung eines Bildes wäre dann dieser hier:
Ich bin allerdings eher ein Feind von CLI-Lösungen, weil man nur wenig Kontrolle hat und es sich nicht gut visualisieren lässt. Aber Du könntest eine Schaltfläche unterhalb der Bilddarstellung mit sowas belegen (Runshell) und dann einfach das Ergebnis laden.
Das geht mit Bordmitteln m.E. nicht, jedenfalls nicht ohne Einbindung einer ActiveX-Komponente (auf diesem Weg machen wir das). Es gibt eine GDI-Funktion "RotateBitmap", die das kann, aber die erfordert GDI+, und das wollten sie in Xbase++ nicht mehr einbauen, weil ja die flächige Unterstützung hochmodernster HTML-Komponenten viel besser wäre, wenn es sie gäbe.

Es gibt ein OpenSource-Tool, das Du über die Kommandozeile aufrufen kannst, es heißt "Magick" (https://imagemagick.org/). Der Kommandozeilenaufruf zur Rotation und Speicherung eines Bildes wäre dann dieser hier:
Code: Alles auswählen
magick "input.jpg" -rotate 90 "output.jpg"
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Oder IrfanView, ja. Es gibt da Dutzende Möglichkeiten. Aber kein Bordmittel.
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Ach so, und das oben verlinkte - kostenlose - Magick hat auch eine API.
Herzlich,
Tom
Tom
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Re: Grafik drehen
Hallo Tom,
ähm, hatte Alaska das nicht vor zwei oder drei Jahren mal eingebaut? Fand ich damals total überraschend. Die wollten damit die Gra...-Funktionen beschleunigen. Oder verwechsle ich das mit irgend was?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Re: Grafik drehen
Moin,
Danke für die vielen Vorschläge. IrfanView benutze ich selber ständig. Magick hatte ich auch gefunden als ich nach einer passenden Funktion gesucht hatte. Aber ich wollte das halt wenn irgend möglich ohne eine extra auszuliefernde Bibliothek machen. Die Funktion wird nur an einer einzigen eher unwichtigen Stelle genutzt. Und dafür will ich nicht extra hunderte Kunden mit einer zusätzlichen Datei belasten.
Und jetzt bitte keine Diskussionen um dieses Thema. Ich bin halt Fan davon möglichst wenig 3rd-party-Dateien mitzuliefern. Manchmal geht es nicht anders. Aber wenn es geht will ich das gerne machen, selbst wenn das vielleicht aufwändiger ist als eine externe Bibliothek. Von daher sind die Vorschläge von Euch oben natürlich willkommen - für den Fall das es wirklich nicht anders geht. Aber ich brauche hier jetzt keine missionarischen Versuche mich zu einer freudigen Nutzung solcher Module zu bewegen. Und wenn die noch so klein, kostenlos, einfach zu nutzen sind.
Jan
Danke für die vielen Vorschläge. IrfanView benutze ich selber ständig. Magick hatte ich auch gefunden als ich nach einer passenden Funktion gesucht hatte. Aber ich wollte das halt wenn irgend möglich ohne eine extra auszuliefernde Bibliothek machen. Die Funktion wird nur an einer einzigen eher unwichtigen Stelle genutzt. Und dafür will ich nicht extra hunderte Kunden mit einer zusätzlichen Datei belasten.
Und jetzt bitte keine Diskussionen um dieses Thema. Ich bin halt Fan davon möglichst wenig 3rd-party-Dateien mitzuliefern. Manchmal geht es nicht anders. Aber wenn es geht will ich das gerne machen, selbst wenn das vielleicht aufwändiger ist als eine externe Bibliothek. Von daher sind die Vorschläge von Euch oben natürlich willkommen - für den Fall das es wirklich nicht anders geht. Aber ich brauche hier jetzt keine missionarischen Versuche mich zu einer freudigen Nutzung solcher Module zu bewegen. Und wenn die noch so klein, kostenlos, einfach zu nutzen sind.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Nicht dass ich wüsste. Das Antialiasing bei GRA-Funktionen wäre dramatisch besser und es stünden viele zusätzliche Funktionen zur Verfügung. Aber als ich den (zu irgendeinem Treffen zugeschalteten) Steffen genau deshalb nach GDI+ gefragt habe, antwortete er sinngemäß: Warum eine veraltete Technologie implementieren/unterstützen, wenn mit HTML-Controls usw. eine ganz neue, weit bessere Welt zur Verfügung stehen wird? Im Ergebnis haben wir beides nicht bzw. eines davon höchstens teilweise.ähm, hatte Alaska das nicht vor zwei oder drei Jahren mal eingebaut?
Herzlich,
Tom
Tom
- Martin Altmann
- Foren-Administrator
- Beiträge: 16751
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 145 Mal
- Danksagung erhalten: 64 Mal
- Kontaktdaten:
Re: Grafik drehen
Wir hatten damals im Informatikstudium im Rahmen der grafischen Datenverarbeitung mit Turbo Pascal eine Bildmanipulation programmiert (verrauschen/entrauschen/vergrößern/verkleinern/rotieren/spiegeln/diverse Filter anwenden). War nicht so aufwändig - viele mathematische Formeln.
Im Falle der Rotation recht einfach.
Das Bild liegt ja in Pixeln vor. Je nach Rotation wird ein Pixel halt an anderer Stelle abgelegt. Du hast also die Originaldatei und liest die Pixelinfos in ein zweidimensionales Array ein. Das Zielarray hat die selbe Größe, aber vertauschte Dimensionen. Du schreibst die erste Zeile der Quelle in die erste Spalte des Ziels (oder in die letzte, je nachdem wie herum du drehst. Dabei darauf achten, dass je nach Drehung die erste Spalte der Quelle in die letzte (oder erste) Zeile des Ziels muss). Einfach ineinander verschachtelte Schleifen.
Danach das Zielarray wieder als Bild rausschreiben. Fertig.
Viele Grüße
Martin
Im Falle der Rotation recht einfach.
Das Bild liegt ja in Pixeln vor. Je nach Rotation wird ein Pixel halt an anderer Stelle abgelegt. Du hast also die Originaldatei und liest die Pixelinfos in ein zweidimensionales Array ein. Das Zielarray hat die selbe Größe, aber vertauschte Dimensionen. Du schreibst die erste Zeile der Quelle in die erste Spalte des Ziels (oder in die letzte, je nachdem wie herum du drehst. Dabei darauf achten, dass je nach Drehung die erste Spalte der Quelle in die letzte (oder erste) Zeile des Ziels muss). Einfach ineinander verschachtelte Schleifen.
Danach das Zielarray wieder als Bild rausschreiben. Fertig.
Viele Grüße
Martin

Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- nightcrawler
- 1000 working lines a day
- Beiträge: 705
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 118 Mal
- Kontaktdaten:
Re: Grafik drehen
nicht bei jpg...da musst Du zuerst jpg-> Bitmap, dann rotieren, dann wieder zurück Bitmap->jpg. Damit automatisch Kompression, ggf Artefakte.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Ach, Martin hat damals sicher auch ein paar Algorithmen zur Bilddekompression eingeatmet, die er hier mit uns teilen kann. Dann hat man ja wieder eine Bitmap.
Aber schon ein lustiger Vorschlag.

Herzlich,
Tom
Tom
- Marcus Herz
- Programmier-Gott
- Beiträge: 1013
- Registriert: Mo, 16. Jan 2006 8:13
- Wohnort: Allgäu
- Hat sich bedankt: 49 Mal
- Danksagung erhalten: 246 Mal
- Kontaktdaten:
Re: Grafik drehen
Das wäre dann wohl SKIA, aber halt 64bit. Das ist das Rendering von z.B. Chrome, etc. List&Label baut das in die nächste Version ein (nur 64bit Version). Ist rattenschnell.Tom hat geschrieben: ↑Di, 08. Apr 2025 13:50 Steffen genau deshalb nach GDI+ gefragt habe, antwortete er sinngemäß: Warum eine veraltete Technologie implementieren/unterstützen, wenn mit HTML-Controls usw. eine ganz neue, weit bessere Welt zur Verfügung stehen wird? Im Ergebnis haben wir beides nicht bzw. eines davon höchstens teilweise.
Combit hat in einer Demo ein PDF mit GDI mit ca. 100 Seiten in 4-5 sec erstellt, mit SKIA waren es unter 2 sec.
Ob man das noch erlebt? 64bit? (Hi Jimmy)
Gruß Marcus
Den Kopf in den Sand zu stecken rettet die Welt auch nicht.
Den Kopf in den Sand zu stecken rettet die Welt auch nicht.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16751
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 145 Mal
- Danksagung erhalten: 64 Mal
- Kontaktdaten:
Re: Grafik drehen
Hmm - was hat man denn im PresentationSpace, wenn man eine Grafik reinlädt? Ich habe es unter Xbase++ noch nicht versucht.
Klar, früher waren das bmp-Dateien. Wir reden hier ja von Ende der 80iger
Viele Grüße
Martin
Klar, früher waren das bmp-Dateien. Wir reden hier ja von Ende der 80iger

Viele Grüße
Martin

Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16751
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 145 Mal
- Danksagung erhalten: 64 Mal
- Kontaktdaten:
Re: Grafik drehen
Nun erzähl mir nicht, dass ihr sowas früher nicht gemacht habt im Studium.
Viele Grüße
Martin

Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16751
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 145 Mal
- Danksagung erhalten: 64 Mal
- Kontaktdaten:
Re: Grafik drehen
Noch einfacher geht es ja mit HTML und CSS - wenn du das bei deinem Control nutzen kannst, schau dir mal die CSS-Eigenschaft transform an.
https://www.dynamsoft.com/codepool/how- ... cript.html
Viele Grüße
Martin

Viele Grüße
Martin

Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen
Klar haben wir das. Und im Prinzip hast Du ja recht. Aber ein eigener Algorithmus zur JPG-Kompression und Dekompression ist kein Klacks.Nun erzähl mir nicht, dass ihr sowas früher nicht gemacht habt im Studium.
Herzlich,
Tom
Tom
- Martin Altmann
- Foren-Administrator
- Beiträge: 16751
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 145 Mal
- Danksagung erhalten: 64 Mal
- Kontaktdaten:
Re: Grafik drehen
Glaube ich Dir - ich schrieb ja auch von Bitmaps.
Viele Grüße
Martin
Viele Grüße
Martin

Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Grafik drehen
Ich verwende dazu die FreeImage DLL ich hätte dir dazu die passenden Funktionen in Xbase++ um das mir der dll zu tun.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Re: Grafik drehen
Moin,
anscheinend liest Diego (Kerejeta) hier mit. Der hat mir per Mail Code zukommen lassen, der das mit Windows-Boardmitteln macht. Klappt super einwandfrei. Mein Dank geht an ihn dafür.
Das hier ist sein Code. Nichts umgeschrieben, nur etwas umformatiert nach meinen Gewohnheiten. Er hat mir auf Rückfrage erlaubt, das hier zu posten.
Jan
anscheinend liest Diego (Kerejeta) hier mit. Der hat mir per Mail Code zukommen lassen, der das mit Windows-Boardmitteln macht. Klappt super einwandfrei. Mein Dank geht an ihn dafür.
Das hier ist sein Code. Nichts umgeschrieben, nur etwas umformatiert nach meinen Gewohnheiten. Er hat mir auf Rückfrage erlaubt, das hier zu posten.
Code: Alles auswählen
FUNCTION Rotate(cFile, cNewFile, nDegrees)
LOCAL lSuccess := .T.
LOCAL bError := NIL
LOCAL oImg := NIL
LOCAL oIP := NIL
LOCAL oFilters := NIL
LOCAL oPT1 := NIL
LOCAL oFilter := NIL
bError := ErrorBlock( {|e| BREAK(e)})
BEGIN SEQUENCE
oImg := CreateObject("WIA.ImageFile")
oIP := CreateObject("WIA.ImageProcess")
oFilters := oIP:Filters
oImg:loadFile(cFile)
oPT1 := oIP:filterInfos("RotateFlip")
oFilters:Add(oPT1:filterID)
oPT1:destroy()
oFilters:destroy()
oFilter := oIP:filters( 1 )
oPT1 := oFilter:properties("RotationAngle")
oPT1:Value := nDegrees
oPT1:destroy()
oFilter:destroy()
oPT1 := oIP:Apply(oImg)
oPT1:SaveFile(cNewFile)
oPT1:destroy()
oImg:destroy()
oIP:destroy()
RECOVER
lSuccess := .F.
FErase(cNewFile)
IF oImg <> NIL
BEGIN SEQUENCE
oImg:destroy()
END SEQUENCE
ENDIF
IF oIP <> NIL
BEGIN SEQUENCE
oIP:destroy()
END SEQUENCE
ENDIF
IF oFilters <> NIL
BEGIN SEQUENCE
oFilters:destroy()
END SEQUENCE
ENDIF
IF oPT1 <> NIL
BEGIN SEQUENCE
oPT1:destroy()
END SEQUENCE
ENDIF
IF oFilter <> NIL
BEGIN SEQUENCE
oFilter:destroy()
END SEQUENCE
ENDIF
END SEQUENCE
ErrorBlock(bError)
RETURN lSuccess
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Grafik drehen [Erledigt]
Cool!
Das hier ist der Hintergrund. Wusste ich nicht, dass es das gibt: https://de.wikipedia.org/wiki/Windows_Image_Acquisition
Das hier ist der Hintergrund. Wusste ich nicht, dass es das gibt: https://de.wikipedia.org/wiki/Windows_Image_Acquisition
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 371
- Registriert: Mi, 09. Jan 2019 16:02
- Wohnort: Neresheim
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 17 Mal
- Kontaktdaten:
Re: Grafik drehen [Erledigt]
Prima!
jetzt wo Diego (Kerejeta) + Jan das mit WIA aufgezeigt hat ist es mir auch wieder eingefallen.
Habe da für meinen WebShop auch mal was mit WIA gemacht um die Bilder anzupassen.
Umwandeln: JPEG-BMP-PNG-GIF-TIFF,
Größe anpassen (Skalieren), Bildqualität (JPG) ändern, Seitenverhältnis,
Flip + Mirror mache ich anders,
und Rotate hatte ich nicht gebraucht
habe das Thema verfolgt aber auf WIA bin ich nicht mehr gekommen...
jetzt wo Diego (Kerejeta) + Jan das mit WIA aufgezeigt hat ist es mir auch wieder eingefallen.
Habe da für meinen WebShop auch mal was mit WIA gemacht um die Bilder anzupassen.
Umwandeln: JPEG-BMP-PNG-GIF-TIFF,
Größe anpassen (Skalieren), Bildqualität (JPG) ändern, Seitenverhältnis,
Flip + Mirror mache ich anders,
und Rotate hatte ich nicht gebraucht
habe das Thema verfolgt aber auf WIA bin ich nicht mehr gekommen...
Gruß
Roland
Roland