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

Зеркальное отражение изображения

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



Автор: Fenik
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Зависимости: Windows, Graphics
Автор:       Fenik, chook_nu@uraltc.ru, Новоуральск
Copyright:   Автор: Федоровских Николай
Дата:        16 июля 2002 г.
***************************************************** }

procedure FlipBitmap(Bitmap: TBitmap; FlipHor: Boolean);
{Зеркальное отражение изображения.
 Если FlipHor = True, то отражение по горизонтали,
 иначе по вертикали.}
var
  x, y, W, H: Integer;
  Pixel_1, Pixel_2: PRGBTriple;
  MemPixel: TRGBTriple;
begin
  Bitmap.PixelFormat := pf24Bit;
  W := Bitmap.Width - 1;
  H := Bitmap.Height - 1;
  if FlipHor then {отражение по горизонтали}
    for y := 0 to H do
    begin
      {помещаем оба указателя на строку H:}
      Pixel_1 := Bitmap.ScanLine[y];
      Pixel_2 := Bitmap.ScanLine[y];
      {помещаем второй указатель в конец строки:}
      Inc(Pixel_2, W);
      {цикл идёт только до середины строки:}
      for x := 0 to W div 2 do
      begin
        {симметричные точки обмениваются цветами:}
        MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1); {смещаем указатель вправо}
        Dec(Pixel_2); {смещаем указатель влево}
      end;
    end
  else {отражение по вертикали}
    {цикл идёт только до средней строки:}
    for y := 0 to H div 2 do
    begin
      {помещаем первый указатель на строку H,
       а второй на строку симметричную H:}
      Pixel_1 := Bitmap.ScanLine[y];
      Pixel_2 := Bitmap.ScanLine[H - y];
      for x := 0 to W do
      begin
        {симметричные точки обмениваются цветами:}
        MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1); {смещаем указатель вправо}
        Inc(Pixel_2); {смещаем указатель вправо}
      end;
    end;
end;

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

Это код Delphi, который реализует процедуру под названием FlipBitmap, чтобы перевернуть изображение горизонтально или вертикально. Процедура принимает два параметра: Bitmap, которое является изображением для переворота, и FlipHor, булевое значение, указывающее, нужно ли перевернуть изображение горизонтально (True) или вертикально (False).

Код сначала устанавливает формат пикселей битмапа в 24-бит RGB (pf24Bit) и затем рассчитывает ширину и высоту битмапа. Он использует два указателя, Pixel_1 и Pixel_2, для перебора пикселей битмапа.

Если FlipHor равно True, код переворачивает изображение горизонтально, перебирая каждую строку битмапа и обменивая соответствующие пиксели с начала и конца каждой строки. Это делается с помощью вложенного цикла, где внешний цикл перебирает каждую строку (y) и внутренний цикл перебирает каждый пиксель внутри этой строки (x).

Если FlipHor равно False, код переворачивает изображение вертикально, перебирая каждую колонку битмапа и обменивая соответствующие пиксели с начала и конца каждой колонки. Это также делается с помощью вложенного цикла, где внешний цикл перебирает каждую колонку (y) и внутренний цикл перебирает каждый пиксель внутри этой колонки (x).

Код использует временное переменное MemPixel для хранения значений пикселей, которые обмениваются.

Вот некоторые улучшения, которые я бы предложил:

  1. Вместо жесткого кодирования формата пикселей как 24-бит RGB, рассмотрите использование свойства Bitmap.PixelFormat для динамического определения формата.
  2. Рассмотрите добавление обработки ошибок для случаев, когда битмапа null или имеет недопустимый формат пикселей.
  3. Код предполагает, что изображение хранится в объекте TBitmap. Если вам нужно поддерживать другие типы изображений (например, TImage), рассмотрите использование полиморфизма или кастинга типа.
  4. Вместо использования raw указателей (PRGBTriple и TRGBTriple) для доступа к пикселям, рассмотрите использование свойства Bitmap.ScanLine для перебора пикселей в более безопасном для памяти способе.

Вот альтернативное решение с помощью встроенных функций обработки изображений Delphi:

procedure FlipBitmap(Bitmap: TBitmap; FlipHor: Boolean);
begin
  if FlipHor then
    Bitmap.Flip(Horizontal)
  else
    Bitmap.Flip(Vertical);
end;

Этот код использует метод Flip объекта TBitmap для переворота изображения горизонтально или вертикально, в зависимости от значения FlipHor. Это намного проще и более эффективный способ достичь того же результата.

В статье описан код на Delphi, реализующий зеркальное отражение изображения битмапа по горизонтали или вертикали.


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

Получайте свежие новости и обновления по 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-29 05:42:32/0.0035510063171387/0