Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как исправить проблему с ориентацией изображений в FMX Delphi 11

Delphi , Графика и Игры , Изображения

 

В процессе разработки приложений на Delphi с использованием FireMonkey (FMX), часто возникает проблема с неправильной ориентацией изображений, загруженных из файлов с EXIF-данными. В частности, TBitmap.LoadFromFile() в FMX игнорирует ориентацию изображения, указанную в EXIF-заголовке, и загружает изображение с его физическими размерами, что может привести к тому, что изображение будет отображаться неправильно (например, в портретном формате, но с размерами в ландшафтном).

В этой статье мы рассмотрим проблему и предложим несколько решений для корректного отображения изображений с учетом ориентации EXIF.

Проблема

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

Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('path_to_image.jpg');
    Image1.Bitmap := Bitmap;
  finally
    Bitmap.Free;
  end;
end;

В этом примере изображение будет загружено с физическими размерами, указанными в файле, и не будет отображено в корректной ориентации.

Решение

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

Использование CCR-Exif

CCR-Exif (https://github.com/Wolfcast/ccr-exif) — это известная библиотека для работы с EXIF-данными в Delphi. Она может читать и писать EXIF-теги и предоставляет возможность извлечь информацию о ориентации изображения.

Пример использования CCR-Exif:

uses
  CCR.Exif;

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
  ExifData: TExifData;
  Orientation: Integer;
begin
  Bitmap := TBitmap.Create;
  ExifData := TExifData.Create('path_to_image.jpg');
  try
    Orientation := ExifData.Orientation;
    Bitmap.LoadFromFile('path_to_image.jpg');
    if Orientation = 3 then
      Bitmap.Rotate90;
    if Orientation = 6 then
      Bitmap.Rotate180;
    if Orientation = 8 then
      Bitmap.Rotate270;
    Image1.Bitmap := Bitmap;
  finally
    ExifData.Free;
    Bitmap.Free;
  end;
end;

Создание собственного решения

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

Пример создания собственной утилиты:

unit JPEGLoaderEXIF;

interface

uses
  System.SysUtils, System.Classes, FMX.Graphics, FMX.Forms;

function JPEGRotationFromStream(Stream: TStream): Integer;
function JPEGRotationFromFile(const FileName: string): Integer;

implementation

function JPEGRotationFromStream(Stream: TStream): Integer;
var
  ExifData: TExifData;
begin
  ExifData := TExifData.Create;
  try
    ExifData.LoadFromStream(Stream);
    Result := ExifData.Orientation;
  finally
    ExifData.Free;
  end;
end;

function JPEGRotationFromFile(const FileName: string): Integer;
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    Result := JPEGRotationFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

end.

Применение преобразований к изображению

После извлечения информации о ориентации из EXIF-заголовка, вы можете применить соответствующие преобразования к изображению с использованием TBitmapSurface.

Пример применения преобразований:

uses
  JPEGLoaderEXIF;

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
  Orientation: Integer;
  BitmapSurface: TBitmapSurface;
begin
  Bitmap := TBitmap.Create;
  Orientation := JPEGRotationFromFile('path_to_image.jpg');
  Bitmap.LoadFromFile('path_to_image.jpg');
  BitmapSurface := Bitmap.Surface;
  try
    case Orientation of
      3: BitmapSurface.Rotate90;
      6: BitmapSurface.Rotate180;
      8: BitmapSurface.Rotate270;
    end;
    Image1.Bitmap := Bitmap;
  finally
    Bitmap.Free;
  end;
end;

Альтернативное решение

Если вам нужно использовать VCL, вы можете адаптировать предложенные выше решения для работы с TBitmap и TJPEGImage. В VCL нет класса TBitmapSurface, поэтому вам нужно будет применить преобразования к изображению самостоятельно.

Пример использования VCL:

uses
  JPEGLoaderEXIF;

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap: TBitmap;
  Orientation: Integer;
begin
  Bitmap := TBitmap.Create;
  Orientation := JPEGRotationFromFile('path_to_image.jpg');
  Bitmap.LoadFromFile('path_to_image.jpg');
  case Orientation of
    3: Bitmap.Rotate90;
    6: Bitmap.Rotate180;
    8: Bitmap.Rotate270;
  end;
  Image1.Picture.Assign(Bitmap);
  Bitmap.Free;
end;

Заключение

Проблема с неправильной ориентацией изображений в FMX Delphi 11 может быть решена путем извлечения информации о ориентации из EXIF-заголовка и применения соответствующих преобразований к изображению. В этой статье мы рассмотрели несколько решений, включая использование CCR-Exif и создание собственной утилиты. Также были предложены альтернативные решения для VCL.

Создано по материалам из источника по ссылке.

В статье рассматривается проблема некорректного отображения изображений в Delphi FireMonkey (FMX) из-за игнорирования EXIF-данных, описывающих ориентацию изображения, и предлагаются решения для её устранения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Изображения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:06:50/0.0034520626068115/0