Entwickler-Ecke

Multimedia / Grafik - JPG bearbeiten


GuaAck - Sa 10.07.21 23:52
Titel: JPG bearbeiten
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:


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.


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 - 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 [http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Graphics.TGraphic.Modified]-Eigenschaft auf true setzen?


jaenicke - 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 - 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 - So 22.08.21 10:32

Jetzt geht es, da stand in der dExif.pas an einer Stelle noch "STRING" statt "ANSISTRING".

Gruß
GuaAck