Mengubah tag Exif gambar "Orientation"

Dec 14 2020

Saya mencoba mengubah tag Exif "Orientation" (0x0112) untuk gambar tertentu dengan kode.

Di sini saya telah menemukan contoh yang berfungsi tentang membaca tetapi saya gagal menulis tag yang sama.

uses
  GDIPAPI, GDIPOBJ, GDIPUTIL;

var
  GPImage: TGPImage;
  BufferSize: Cardinal;
  Orientation: Byte;
  RotateType: TRotateFlipType;
  EncoderClsid: TGUID;
  PI : PropertyItem;
begin
  GPImage := TGPImage.Create('.\test_up.jpg');
  try
    BufferSize := GPImage.GetPropertyItemSize(PropertyTagOrientation);
    if BufferSize <= 0
    then raise Exception.Create('BufferSize <= 0');

    Orientation := 6; //this should be Rotate90FlipNone

    PI.id := PropertyTagOrientation;
    PI.type_ := 3;
    PI.length := BufferSize;
    PI.value := PByte(Orientation);

    GPImage.SetPropertyItem(PI);

    GetEncoderClsid('image/jpeg', EncoderClsid);
    GPImage.Save('.\test_up_Rotate90FlipNone.jpg', EncoderClsid);
  finally
    GPImage.Free
  end;
end;

Saat runtime memunculkan yang berikut EAccessViolationdi GPImage.SetPropertyItem(PI);baris:

Pelanggaran akses di alamat 757A8E30 dalam modul 'msvcrt.dll'. Membaca alamat 00000006.

Ini test_up.jpg saya :

Jawaban

1 fpiette Dec 14 2020 at 16:09

Saya berhasil menggunakan kode ini:

procedure TOvbCustomImage.SetImageOrientation(AGPImage: TGPImage; Value: WORD);
var
    PropItem : TPropertyItem;
begin
    if not Assigned(AGPImage) then
        Exit;
    PropItem.Id            := PropertyTagOrientation;
    PropItem.Length        := SizeOf(WORD);
    PropItem.Type_         := PropertyTagTypeShort;
    PropItem.Value         := @Value;
    AGPImage.SetPropertyItem(PropItem);
end;

Ini adalah fungsi yang saya tulis di aplikasi saya. Kode sumber lengkap di GitHub .