Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2010, 20:52   #1
DeDoK
Форумчанин
 
Аватар для DeDoK
 
Регистрация: 05.11.2007
Сообщений: 392
По умолчанию поворот изображения

как повернуть картинку bmp на 90, 180, 270 градусов?
DeDoK вне форума Ответить с цитированием
Старый 06.09.2010, 21:11   #2
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

http://GoogleForIdiots.com/

Write "как повернуть картинку bmp delphi", then click "Find"
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 06.09.2010, 21:22   #3
DeDoK
Форумчанин
 
Аватар для DeDoK
 
Регистрация: 05.11.2007
Сообщений: 392
По умолчанию

гуглил. нема. или есть но не то
DeDoK вне форума Ответить с цитированием
Старый 06.09.2010, 21:25   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    DrawBtn: TButton;
    AngleEdit: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    XEdit: TEdit;
    YEdit: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
//    procedure RotateBitmapFast(Src: TBitmap; out Dest: TBitmap; Center: TPoint; Angle: Double);
    procedure DrawBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  BGR = packed record
    B: Byte;
    G: Byte;
    R: Byte;
  end;

  TBGR = array [word] of BGR;

var
  Form1: TForm1;
  Img, Bmp: TBitmap;      // битмапы
  DC: HDC;                // контекст
  t: Integer;             // таймер
  Center: TPoint;         // для центра вращения


implementation

{$R *.dfm}

procedure RotateBitmapFast(Src: TBitmap; out Dest: TBitmap; Angle: Double);
var
  x, y: Integer;
  PixelX, PixelY: Integer;
  DispX, DispY: Integer;
  SrcBGR, DestBGR: ^TBGR;
  SinRad, CosRad: Double;
  Center: TPoint;
begin
Center.X:=Src.Width div 2
Dest.Width := Src.Width;
Dest.Height := Src.Height;
Dest.PixelFormat := pf24bit;
SinRad := Sin(-Angle);
CosRad := Cos(-Angle);
For y := Dest.Height - 1 downto 0 do
 Begin
  DestBGR := Dest.Scanline[y];
  DispX := 2 * (y - Center.Y) + 1;
   For x := Dest.Width-1 downto 0 do
    Begin
     DispY := 2 * (x - Center.X) + 1;
     PixelX := (Round(DispY * CosRad - DispX * SinRad) - 1) div 2 + Center.X;
     PixelY := (Round(DispY * SinRad + DispX * CosRad) - 1) div 2 + Center.Y;

     If (PixelX >= 0) and (PixelX <= Src.Width-1)
         and (PixelY >= 0) and (PixelY <= Src.Height-1)
      then Begin
        SrcBGR := Src.Scanline[PixelY];
        DestBGR[x] := SrcBGR[PixelX]
       end
       else Begin
        DestBGR[x].B := 0;
        DestBGR[x].G := 0;
        DestBGR[x].R := 0;
       end;
    end;
 end;
end;

procedure TForm1.DrawBtnClick(Sender: TObject);
begin
  // создание, загрузка картинки источника
  Img := TBitmap.Create;
  Img.LoadFromFile('sprite.bmp');

  // создание приемника изображения
  Bmp := TBitmap.Create;
  Bmp.PixelFormat := pf24bit;
  Bmp.Width := Img.Width;
  Bmp.Height := Img.Height;

  // получить счет
  t := GetTickCount;

  // в проверку, если пользователь начудит с координатами
  Try
    Center.X := StrToInt(XEdit.Text);
    Center.Y := StrToInt(YEdit.Text);
    RotateBitmapFast(Img, Bmp, StrToInt(AngleEdit.Text));
  Finally
    Label2.Caption := 'Время выполнения: '+IntToStr(GetTickCount-t)+' мс';
    Img.Free;
  end;

  // получить контекст формы
  DC := GetDC(Form1.Handle);
  // отрисовка от точки (20,20) до размеров битмапа
  BitBlt(DC, 20, 20, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
  // освобождение контекста
  ReleaseDC(Form1.Handle, DC);
  // удаление
  DeleteDC(DC);
end;

end.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 06.09.2010, 21:34   #5
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

3-я ссылка:

Код:
const
  PixelMax = 32768;

type
  pPixelArray = ^TPixelArray;
  TPixelArray = array [0..PixelMax-1] of TRGBTriple;

procedure RotateBitmap_ads(SourceBitmap: TBitmap;
out DestBitmap: TBitmap; Center: TPoint; Angle: Double);
var
  cosRadians : Double;
  inX : Integer;
  inXOriginal : Integer;
  inXPrime : Integer;
  inXPrimeRotated : Integer;
  inY : Integer;
  inYOriginal : Integer;
  inYPrime : Integer;
  inYPrimeRotated : Integer;
  OriginalRow : pPixelArray;
  Radians : Double;
  RotatedRow : pPixelArray;
  sinRadians : Double;
begin
  DestBitmap.Width := SourceBitmap.Width;
  DestBitmap.Height := SourceBitmap.Height;
  DestBitmap.PixelFormat := pf24bit;
  Radians := -(Angle) * PI / 180;
  sinRadians := Sin(Radians);
  cosRadians := Cos(Radians);
  for inX := DestBitmap.Height-1 downto 0 do
  begin
    RotatedRow := DestBitmap.Scanline[inX];
    inXPrime := 2*(inX - Center.y) + 1;
    for inY := DestBitmap.Width-1 downto 0 do
    begin
      inYPrime := 2*(inY - Center.x) + 1;
      inYPrimeRotated := Round(inYPrime * CosRadians - inXPrime * sinRadians);
      inXPrimeRotated := Round(inYPrime * sinRadians + inXPrime * cosRadians);
      inYOriginal := (inYPrimeRotated - 1) div 2 + Center.x;
      inXOriginal := (inXPrimeRotated - 1) div 2 + Center.y;
      if (inYOriginal >= 0) and (inYOriginal <= SourceBitmap.Width-1) and
      (inXOriginal >= 0) and (inXOriginal <= SourceBitmap.Height-1) then
      begin
        OriginalRow := SourceBitmap.Scanline[inXOriginal];
        RotatedRow[inY] := OriginalRow[inYOriginal]
      end
      else
      begin
        RotatedRow[inY].rgbtBlue := 255;
        RotatedRow[inY].rgbtGreen := 0;
        RotatedRow[inY].rgbtRed := 0
      end;
    end;
  end;
end;

{Usage:}
procedure TForm1.Button1Click(Sender: TObject);
var
  Center : TPoint;
  Bitmap : TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Center.y := (Image.Height div 2)+20;
    Center.x := (Image.Width div 2)+0;
    RotateBitmap_ads(
    Image.Picture.Bitmap,
    Bitmap,
    Center,
    Angle);
    Angle := Angle + 15;
    Image2.Picture.Bitmap.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот изображения Djony_91 Мультимедиа в Delphi 1 26.05.2010 16:15
поворот изображения на форме choknutii Общие вопросы C/C++ 1 21.07.2009 11:20
поворот изображения Пепел Феникса Мультимедиа в Delphi 1 21.06.2009 19:53
Вращение (поворот на заданный угол) векторного изображения Македонский Мультимедиа в Delphi 6 26.02.2009 21:19
Поворот изображения на заданный угол. taller07 Мультимедиа в Delphi 4 28.11.2008 14:01