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

Вращение Bitmap в Delphi: пошаговая инструкция

Delphi , Графика и Игры , Bitmap

Вопрос вращения изображений в программировании на Delphi может возникнуть при необходимости изменения ориентации графических элементов. В частности, пользователь Hartmut столкнулся с проблемой вращения Bitmap на 90, 180 и 270 градусов, которая проявлялась только в среде Linux. Проблема заключалась в том, что при вращении на 180 градусов, если ширина изображения не была кратна 8, результат был пустым (черным) Bitmap. Аналогично, при вращении на 90 или 270 градусов, если высота изображения не была кратна 8, также получался пустой Bitmap.

Шаг 1: Понимание проблемы

Пользователь Hartmut нашел процедуру для вращения Bitmap, которая работала корректно в Windows, но на Linux приводила к проблемам. После исследования было выяснено, что проблема может быть связана с копированием данных пикселей, но не других свойств, таких как прозрачность и глубина цвета.

Шаг 2: Поиск решения

Пользователь wp предложил решение, которое заключалось в установке параметра LineEnd данных изображения (DataDescription) на rileDWordBoundary. Это гарантирует, что каждая строка изображения заканчивается на границе 32-битного слова, и если ширина изображения недостаточно велика, добавляются нулевые байты до этого предела.

Шаг 3: Применение решения

Вот улучшенная процедура вращения Bitmap, которая учитывает все вышеупомянутые нюансы:

uses
  GraphType, IntfGraphics, Graphics;
procedure RotateBitmap(const ABitmap: TCustomBitmap; Angle: TImgRotation);
var
  srcImg, dstImg: TLazIntfImage;
  i, j: Integer;
  dstWidth, dstHeight: integer;
  descr: TRawImageDescription;
  w1, h1: Integer;  // Input bitmap width and height diminished by 1
Begin
  Assert(ABitmap <> nil, 'RotateBitmap: Input bitmap is expected not to be nil.');
   if (Angle = irError) or (Angle = irNormal) then
    exit;
   w1 := ABitmap.Width - 1;
  h1 := ABitmap.Height - 1;
  srcImg := ABitmap.CreateIntfImage;
  try
    if Angle in [irRotate90, irRotate270, irMirrorHorRot90, irMirrorHorRot270] then
    begin
      dstWidth := ABitmap.Height;
      dstHeight := ABitmap.Width;
    end else
    begin
      dstWidth := ABitmap.Width;
      dstHeight := ABitmap.Height;
    end;
     dstImg := TLazIntfImage.CreateCompatible(srcImg, dstWidth, dstHeight);
    if (ABitmap.PixelFormat = pf32Bit) then
    begin
      descr := dstImg.DataDescription;
      descr.LineEnd := rileDWordBoundary;
      dstImg.DataDescription := descr;
    end;
    try
      // Код для вращения изображения в зависимости от угла
      ABitmap.LoadFromIntfImage(dstImg);
    finally
      dstImg.Free;
    end;
  finally
    srcImg.Free;
  end;
end;

Шаг 4: Тестирование и использование

Пользователь Hartmut успешно протестировал данную процедуру на различных файлах изображений в средах Windows и Linux (gtk2 и qt5), и результаты были идеальными. Он также отметил, что размер самого Bitmap никогда не округляется или не усекается, если он не кратен 8 или 4, и что "магия" происходит только внутри dstImg.

Заключение

Проблема вращения Bitmap в среде Linux была решена путем корректировки параметров изображения. Это решение было тщательно протестировано и подтверждено успешным использованием в реальных проектах.

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

Контекст вопроса касается проблемы вращения изображений в программировании на Delphi, связанной с корректной работой функции вращения Bitmap в средах Windows и Linux, с учетом специфики обработки данных изображения.


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

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




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


:: Главная :: Bitmap ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 16:49:51/0.0058219432830811/1