Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 341
Erhaltene Danke: 31

Windows 8.1
Delphi 10.3 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: 4455
Erhaltene Danke: 972

Win10
C#, C++ (VS 2015/17/19)
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: 19022
Erhaltene Danke: 1698

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), 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).