Modification de l’orientation de la balise Exif d’une image
Dec 14 2020
J'essaye de changer la balise Exif "Orientation" (0x0112) pour une image donnée par code.
Ici, j'ai trouvé un exemple de travail sur la lecture, mais j'échoue à écrire la même balise.
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;
Au moment de l'exécution, il soulève ce qui suit EAccessViolation
à la GPImage.SetPropertyItem(PI);
ligne:
Violation d'accès à l'adresse 757A8E30 dans le module «msvcrt.dll». Lecture de l'adresse 00000006.
Voici mon test_up.jpg :

Réponses
1 fpiette Dec 14 2020 at 16:09
J'utilise avec succès ce code:
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;
C'est une fonction que j'ai écrite dans mon application. Code source complet sur GitHub .