Почему TImage вращает мое изображение?

Написание мобильного приложения - оно вытягивает изображения с защищенного веб-сайта, и показанное ниже (первое изображение) тянет неправильно (обратите внимание, веб-версия против мобильной версии), второе изображение правильно отображается на веб-сайте, но Delphi TImage по какой-то причине поворачивает его и я не могу понять, почему. Поворот установлен на 0, а "Подгонка" установлена ​​для компонента TImage.

Мысли?

Почему это вращается так

4 ответа

Jpeg и Tiff имеют метаданные Exif (Exchangeable image file format), которые определяют ориентацию изображения (среди других данных).

Дело не в том, что "изображение вращает мое изображение". TImage не обрабатывает метаданные ориентации Exif. В идеале TImage должен автоматически поворачивать изображение в соответствии с метаданными ориентации, но это не так. Вам необходимо прочитать свойство ориентации Exif и соответственно повернуть изображение.

Спецификация Exif-тега "Ориентация" (0x0112):

1 = Horizontal (normal) 
2 = Mirror horizontal 
3 = Rotate 180 
4 = Mirror vertical 
5 = Mirror horizontal and rotate 270 CW 
6 = Rotate 90 CW 
7 = Mirror horizontal and rotate 90 CW 
8 = Rotate 270 CW

Вы можете использовать некоторые бесплатные компоненты Exif, такие как TExif/NativeJpg/CCR Exif, и при необходимости поворачивать изображение в соответствии с тегом ориентации.

Вот пример использования GDI+ (VCL/Windows), например:

uses GDIPAPI, GDIPOBJ;

procedure TForm1.Button1Click(Sender: TObject);
var
  GPImage: TGPImage;
  GPGraphics: TGPGraphics;
  pPropItem: PPropertyItem;
  BufferSize: Cardinal;
  Orientation: Byte;
  RotateType: TRotateFlipType;
  Bitmap: TBitmap;
begin
  GPImage := TGPImage.Create('D:\Test\image.jpg');
  try
    BufferSize := GPImage.GetPropertyItemSize(PropertyTagOrientation);
    if BufferSize > 0 then
    begin
      GetMem(pPropItem, BufferSize);
      try
        GDPImage.GetPropertyItem(PropertyTagOrientation, BufferSize, pPropItem);
        Orientation := PByte(pPropItem.value)^;
        case Orientation of
          1: RotateType := RotateNoneFlipNone; // Horizontal - No rotation required
          2: RotateType := RotateNoneFlipX;
          3: RotateType := Rotate180FlipNone;
          4: RotateType := Rotate180FlipX;
          5: RotateType := Rotate90FlipX;
          6: RotateType := Rotate90FlipNone;
          7: RotateType := Rotate270FlipX;
          8: RotateType := Rotate270FlipNone;
        else
          RotateType := RotateNoneFlipNone; // Unknown rotation?
        end;
        if RotateType <> RotateNoneFlipNone then
          GPImage.RotateFlip(RotateType);
        Bitmap := TBitmap.Create;
        try
          Bitmap.Width := GPImage.GetWidth;
          Bitmap.Height := GPImage.GetHeight;
          Bitmap.Canvas.Lock;
          try
            GPGraphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
            try
              GPGraphics.DrawImage(GPImage, 0, 0, GPImage.GetWidth, GPImage.GetHeight);
              Image1.Picture.Assign(Bitmap);              
            finally
              GPGraphics.Free;
            end;
          finally
            Bitmap.Canvas.Unlock;
          end;    
        finally
          Bitmap.Free;
        end;
      finally
        FreeMem(pPropItem);
      end;
    end;
  finally
    GPImage.Free
  end;
end;

Спецификация Exif определяет тег ориентации, чтобы указать ориентацию камеры относительно захваченной сцены. Поэтому некоторые приложения могут автоматически поворачивать изображение, соответствующее этому EXIF-флажку. Я предполагаю, что ваша веб-версия делает это автоматически. TImage это не делает.

Веб-сайт, безусловно, считывает exif-данные изображения, которые содержат ориентацию фотографии, а затем поворачивает изображение соответствующим образом. Delphi нет. Вы должны прочитать метаданные изображения для этого (поиск "exif" в Google)

Спасибо всем.

Не программное решение, но у меня сработало....

Я использовал бесплатное программное обеспечение InfranView для обработки изображений, чтобы проверить изображения, и отключил считанные данные EXIF, которые показали мне изображения, которые были повернуты неправильно. Я изменил и повторно сохранил файлы и обновил сайт.

Другие вопросы по тегам