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 .