Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - JPG Hochkant-Querformat-Bilder korrekt anzeigen
hRb - Di 11.06.24 00:23
Titel: JPG Hochkant-Querformat-Bilder korrekt anzeigen
Hallo zusammen
vor längerer Zeit habe ich ein Bild-Sortier-Programm entwickelt. In einer Image-Liste werden die Bilder als Icons angezeigt (siehe GetTumbnail von Jaenicke hier unter Entwickler-Ecke). Diese Funktion zeigt die Icons korrekt an, ganz gleich ob in Hoch- oder Querformat fotografiert. Parallel zur ImageListe stehen die Pfadnamen in einer Stringgridliste.
Nun wollte ich die Bilder in Vollscreen-Darstellung anzeigen und stelle fest, dass Hochformatbilder querliegend (um 90 Grad falsch) angezeigt werden. Wie erkennte ich in jpg Hochformatbilder und wie kann ich die Anzeige drehen?
Meine Befehlsfolge ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89:
| procedure TForm1.GrossbildStartMitRandClick(Sender: TObject); begin Form4.BorderStyle := bsSizeable; Form4.FormStyle := fsNormal; Form4.Windowstate := wsMaximized; Form4.Show; Form4.SetFocus; end;
procedure TForm1.GrossbildStartOhneRandClick(Sender: TObject); begin Form4.BorderStyle := bsNone; Form4.FormStyle := fsStayOnTop; Form4.BoundsRect := Monitor.BoundsRect; Form4.Show; Form4.SetFocus; end;
procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var myRect: TGridRect; begin Case Key of VK_Escape: Begin Form4.Close; Form1.Show; Form1.SetFocus; end; VK_Left: begin with Form1.StringGrid1 do begin NextBild := Row; repeat dec(NextBild); if (NextBild > 0) and (NextBild < RowCount-1) then Row := NextBild; until(NextBild < 1) or (Cells[1,NextBild] = '>>>') ; if (NextBild < 1) then begin Messagedlg('Ordneranfang erreicht oder keine Datei markiert' + #10 + 'Zum Beenden drücke Taste ESC', mtInformation, [mbOK], 0); exit; end else begin FiName := Cells[8,NextBild] + Cells[2,NextBild] + Cells[3,NextBild]; Image1.Picture.LoadFromFile(FiName); Form4.Caption:= 'Form4 ' + FiName; end ; end; end; VK_Right: begin with Form1.Stringgrid1 do begin NextBild := Row; repeat inc(NextBild); if (NextBild > 0) and (NextBild < RowCount) then Row := NextBild; until(NextBild > RowCount-1) or (Cells[1,NextBild] = '>>>') ; if (NextBild>=RowCount) then begin Messagedlg('Ordnerende erreicht oder keine Datei markiert' + #10 + 'Zum Beenden drücke Taste ESC', mtInformation, [mbOK], 0); exit; end else begin FiName := Cells[8,NextBild] + Cells[2,NextBild] + Cells[3,NextBild]; Image1.Picture.LoadFromFile(FiName); Form4.Caption:= 'Form4 ' + FiName; end ; end; end; else begin Key := 0; end; End; end; |
Gausi - Di 11.06.24 09:54
Bin kein Experte darin, aber mein erster Ansatz wäre nachzuschauen, ob die Orientierung (also Aufnahme im Hoch- oder Querformat) in den Exif-Daten der JPEG-Datei drinsteht - und dann entsprechend darauf reagieren.
Jpegs in 90° Schritten drehen geht wohl auch komplett verlustfrei - wie das genau geht, weiß ich aber nicht.
hRb - Sa 15.06.24 20:47
Zunächst Danke für Antworten.
Habe dennoch ein Problem mit den Tips. Ich nutze Delphi 11 (Update 3) Version 28.0.48361.3236. Die Komponente TImage enthält kein Rotate. Auch nach Einbinden der Uses GDIPOBJ, GDIPAPI lassen sich die unterschiedlichen Beispiel-Codes nicht kompilieren (Objekte nicht vorhanden). Die Beispiele verwenden wohl andere Delphi-Versionen. Werde als Laie noch weiter studieren müssen. Allein die Exif-Daten zu lesen scheint nicht einfach, da es ja unterschiedliche Bildformate gibt (tif, gig, jpg, etc)
MAlsleben - Fr 09.08.24 13:23
Hallo,
zum auslesen der exif Daten hab ich die unit
ccr-exif [
https://github.com/sasgis/ccr-exif] genommen. Funktioniert unter VCL und FMX ganz gut.
Zum ermitteln der Richtung, vorausgesetzt die Kamera liefert den Wert,
Delphi-Quelltext
1:
| TagIdWertAusrichtung:=ExifData.Sections[esGeneral].GetWordValue(ttOrientation,0); |
Unter FMX mit folgenden Code gedreht:
Delphi-Quelltext
1: 2: 3: 4: 5:
| case TagIdWertAusrichtung of 3: Image1.Bitmap.Rotate(180); 6: Image1.Bitmap.Rotate(-90); 8: Image1.Bitmap.Rotate(90); end; |
Gruß Micha
Moderiert von
Th69: URL-Titel hinzugefügt
Moderiert von
Th69: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!