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 EAccessViolation
di 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 .
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'