Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 10.07.21 23:52 
Hallo,

letzter Beitrag zu diesem Thema war vor 6 Monaten, aber vielleicht liest das hier ja jemand und hat einen Tipp.

Ich möchte in eine größere Anzahl JPG-Fotos Text einfügen, z. B. den Dateinamen.

Der folgende Code scheint einwandfrei zu arbeiten, aber leider ist die gespeicherte JPG identisch zu der geladenen, funktioniert also NICHT:

ausblenden 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:
PROCEDURE TFTextinJPG.Button1Click(Sender: TObject);

CONST
  Pfad0 = 'D:\Fotos\Delphi\TextinJPG\Test0\';
  Pfad1 = 'D:\Fotos\Delphi\TextinJPG\Test1\';
  Filename = 'Testbild.JPG';
VAR
  Bild1, Bild2: tjpegimage;

BEGIN
  Bild1 := tjpegimage.Create;
  Bild2 := tjpegimage.Create;

  Bild1.LoadFromFile(Pfad0 + Filename);
  // Bild1.DIBNeeded; // nützt nichts
  Bild1.Canvas.font.Size := 100;
  Bild1.Canvas.font.Color := clred;
  Bild1.Canvas.TextOut(200200, Filename);
  //  Bild1.JPEGNeeded; // nützt nichts
  Bild1.SaveToFile(Pfad1 + Filename);

  Bild1.Free;
  Bild2.Free;
END;


Kopiere ich aber das JPG-Bild zur Bearbeitung in eine Bitmap und dann wieder zurück in ein tjpegimage, dann funktioniert es. Leider sind dann die Metadaten des JPG weg, was logisch ist.

ausblenden 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:
PROCEDURE TFTextinJPG.Button1Click(Sender: TObject);
CONST
  Pfad0 = 'D:\Fotos\Delphi\TextinJPG\Test0\';
  Pfad1 = 'D:\Fotos\Delphi\TextinJPG\Test1\';
  Filename = 'Testbild.JPG';
VAR
  Bild1, Bild2: tjpegimage;
  bmp: Tbitmap;

BEGIN
  Bild1 := tjpegimage.Create;
  Bild2 := tjpegimage.Create;
  Bmp := TBitmap.Create;

  Bild1.LoadFromFile(Pfad0 + Filename);
  Bmp.Assign(Bild1);
  Bmp.Canvas.font.Size := 100;
  Bmp.Canvas.font.Color := clred;
  Bmp.Canvas.TextOut(200200, Filename);
  Bild2.Assign(Bmp);
  Bild2.SaveToFile(Pfad1 + Filename);

  Bild1.Free;
  Bild2.Free;
  Bmp.Free;
END;


Wäre schön, jemand hätte einen Tipp.

Viele Grüße
GuaAck
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 11.07.21 09:40 
Wenn du das JPG aus deinem ersten Code in einem TImage anzeigst, wird es dann mit Text korrekt angezeigt?
Evtl. mußt du auch nur die Modified-Eigenschaft auf true setzen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 11.07.21 13:58 
Ein kurzer Blick in den Debugger zeigt, dass SaveToFile selbst JPEGNeeded auifruft, dort aber bei vorhandenen Jpeg-Daten die Bitmap, in der gezeichnet wurde, gar nicht verwendet wird.

Du musst also manuell Compress vor dem SaveToFile aufrufen (und ggf. auch die Qualität vorher setzen).
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 21.08.21 22:54 
Hallo Jaenicke,

Danke nach längerer Zeit, in der ich nicht zu diesem Problem gekommen bin. Jetzt habe ich es mit dem zusätzlichen "compress" probieren können. Meine in Canvas gemalte Änderung wird korrekt ins JPG übernommen, perfekt!!

Die Metadaten sind allerdings trotzdem verloren, vermutlich unterstützt schon tjpegimage keine Metadaten.

Es gibt eine Library dExif, mit der man die EXIF-Daten sehr gut lesen und darstellen kann, habe ich probiert. Die soll auch einem geänderten Bild EXIF-Daten hinzufügen können. Mein damit erstelltes Programm läuft zwar durch, aber das resultierende *.JPG kann von einschlägigen Fotoprogrammen nicht geöffnet werden. (Die Dateilänge ist plausibel.)

Danke also,
Gruß
GuaAck
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: So 22.08.21 10:32 
Jetzt geht es, da stand in der dExif.pas an einer Stelle noch "STRING" statt "ANSISTRING".

Gruß
GuaAck