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

Наклон изображения по вертикали и горизонтали

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



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

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

procedure InclinationBitmap(Bitmap: TBitmap; Hor,
  Ver: Double; BackColor: TColor);

  function Tan(X: Extended): Extended;
    // Tan := Sin(X) / Cos(X)
  asm
        FLD X
        FPTAN
        FSTP ST(0) // FPTAN pushes 1.0 after result
        FWAIT
  end;

type
  TRGB = record
    B, G, R: Byte;
  end;
  pRGB = ^TRGB;
var
  x, y, WW, HH, alpha: Integer;
  OldPx, NewPx: PRGB;
  T: Double;
  Bmp: TBitmap;
begin
  Bitmap.PixelFormat := pf24Bit;
  Bmp := TBitmap.Create;
  try
    Bmp.Assign(Bitmap);
    WW := Bitmap.Width;
    HH := Bitmap.Height;
    if Hor <> 0.0 then
    begin // По горизонтали
      T := Tan(Hor * (Pi / 180));
      Inc(WW, Abs(Round(HH * T)));
      Bitmap.Width := WW;
      Bitmap.Canvas.Brush.Color := BackColor;
      Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
      for y := 0 to HH - 1 do
      begin
        if T > 0 then
          alpha := Round((HH - y) * T)
        else
          alpha := -Round(y * T);
        OldPx := Bmp.ScanLine[y];
        NewPx := Bitmap.ScanLine[y];
        Inc(NewPx, Alpha);
        for x := 0 to Bmp.Width - 1 do
        begin
          NewPx^ := OldPx^;
          Inc(NewPx);
          Inc(OldPx);
        end;
      end;
      Bmp.Assign(Bitmap);
    end;
    if Ver <> 0.0 then
    begin // По вертикали
      T := Tan(Ver * (Pi / 180));
      Bitmap.Height := HH + Abs(Round(WW * T));
      Bitmap.Canvas.Brush.Color := BackColor;
      Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
      for x := 0 to WW - 1 do
      begin
        if T > 0 then
          alpha := Round((WW - x) * T)
        else
          alpha := -Round(x * T);
        for y := 0 to Bmp.Height - 1 do
        begin
          NewPx := Bitmap.ScanLine[y + alpha];
          OldPx := Bmp.ScanLine[y];
          Inc(OldPx, x);
          Inc(NewPx, x);
          NewPx^ := OldPx^;
        end;
      end;
    end;
  finally
    Bmp.Free;
  end;
end;

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

InclinationBitmap(FBitmap, 7.151, -5.8, clWhite); 

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

Вот подробное описание того, что делает каждый часть кода:

  1. Функция Tan вычисляет тангенс угла в радианах.
  2. Процедура InclinationBitmap принимает четыре параметра:

    • Bitmap: Изображение, которое будет преобразовано.
    • Hor и Ver: Углы наклона в градусах для горизонтального и вертикального преобразований соответственно.
    • BackColor: Цвет, который будет использоваться для заполнения фона после преобразования.
  3. Внутри процедуры:

    • Если Hor не равно нулю, то вычисляется новый ширина битмапа на основе тангента угла и заполняется фон указанным цветом. Затем для каждого пикселя в оригинальном изображении оно смещает соответствующие пиксели в преобразованном изображении с помощью рассчитанного alpha-значения.

    • Если Ver не равно нулю, то вычисляется новый высота битмапа на основе тангента угла и заполняется фон указанным цветом. Затем для каждого пикселя в оригинальном изображении оно смещает соответствующие пиксели в преобразованном изображении вертикально с помощью рассчитанного alpha-значения.

  4. Наконец, код очищает память, освобождая временный битмап, созданный для хранения результата преобразования.

Пример использования этой процедуры:

InclinationBitmap(FBitmap, 7.151, -5.8, clWhite);

Это будет применить преобразование к FBitmap с горизонтальным наклоном в 7,15 градусов и вертикальным наклоном в -5,8 градусов, заполнив фон белым цветом.

Код написан на языке Delphi, поэтому он не является прямой совместимостью с другими программными языками или платформами без модификации.

П程мик в 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-05-01 13:14:24/0.0051519870758057/1