Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 269
Erhaltene Danke: 12



BeitragVerfasst: Di 11.06.24 00:23 
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:

ausblenden volle Höhe 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);
// Button zum Umschalten auf Form4 (Großbild) [b]mit Rand [/b]
begin // Bildschirm Normal
  Form4.BorderStyle := bsSizeable;
  Form4.FormStyle := fsNormal;
  Form4.Windowstate := wsMaximized;
  // SetBounds(oldX, oldY, oldW, oldH);
  Form4.Show;
  Form4.SetFocus;
end;

procedure TForm1.GrossbildStartOhneRandClick(Sender: TObject);
// Button zum Umschalten auf Form4 (Großbild) [b]ohne Rand [/b]
begin // Bildschirm VollBild
  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);
{Bilder anzeigen gemäß Stringgridliste. Es werden nur Bilder angezeigt.
 die in der StringgridListe Spalte 1 markiert sind >>>> }

var
  myRect: TGridRect;
begin
  Case Key of
    VK_Escape:  //Bendet Großbildschirm, zurück zum Hauptprogramm
      Begin // {esc=27}
        Form4.Close; //Form schließen
        Form1.Show;
        Form1.SetFocus;
      end;
    VK_Left:
      begin with Form1.StringGrid1 do
        begin
          NextBild := Row;
          repeat
            dec(NextBild);
            if (NextBild > 0and (NextBild < RowCount-1then
              Row := NextBild; // Zelle-1 markieren
          until(NextBild < 1or (Cells[1,NextBild] = '>>>'{cSymb};
          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];
// Hochformat wird nicht korrekt angezeigt
            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 > 0and (NextBild < RowCount) then
              Row := NextBild; // Zelle+1 markieren
          until(NextBild > RowCount-1or (Cells[1,NextBild] = '>>>'{cSymb};
          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];
// Hochformat wird nicht korrekt angezeigt
            Image1.Picture.LoadFromFile(FiName);
            Form4.Caption:= 'Form4 ' + FiName;
          end ;
        end;
      end;
    else
      begin
       Key := 0;
      end;
  End;
end;
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8536
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4765
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 11.06.24 17:40 
Hallo hRb,

evtl. hilft dir Rotate Image Component?

Oder aber du nutzt eine der Antworten aus Rotate TImage in Delphi. Mir persönlich gefällt davon die GDI+ Funktion RotateFlip am besten (diese gibt es auch in .NET).
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 269
Erhaltene Danke: 12



BeitragVerfasst: 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)