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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 20:25   #1
delphin100
Он лайн
Форумчанин
 
Аватар для delphin100
 
Регистрация: 26.09.2007
Сообщений: 173
Вопрос Поворот картинки

Здравствуйте!
Кто знает как повернуть картинку относительно вертикальной оси. Может кто-то занимался данной проблемой. Если кто-то знает алгоритм поворота не только вокруг оси, но и относительно точки картинки.
delphin100 вне форума Ответить с цитированием
Старый 25.03.2009, 21:21   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если память не подводит, то есть открытая библиотека FastDIB для дельфи. Открываем смотрим класс и ищем поворот.
BOBAH13 вне форума Ответить с цитированием
Старый 25.03.2009, 22:22   #3
delphin100
Он лайн
Форумчанин
 
Аватар для delphin100
 
Регистрация: 26.09.2007
Сообщений: 173
По умолчанию

Спасибо попробую кстати если просто сужать потом расширять картинку не знаете как реалистично или нет. Про библиотеку сейчас попробую.
delphin100 вне форума Ответить с цитированием
Старый 25.03.2009, 22:40   #4
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Можно с старыми добрыми Синусами и Косинусами, но страдает качество...
Levsha100 вне форума Ответить с цитированием
Старый 25.03.2009, 23:00   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Погляди тут (пост №27)... Там есть нечто похожее...

Открой там папку "rotozoom" и скомпилируй проэкт... Только чтоб не текст, а картинка крутилась нужно скопировать файл "ijl15.dll" из корневого каталога в папку проэкта...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 28.03.2009, 01:36   #6
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
Сообщение

delphin100, попробуйте разобраться с этом коде

Код:
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.
Levsha100, а качество не теряется.. покрайней мере я не заметил
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 29.03.2009, 10:42   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Можно с старыми добрыми Синусами и Косинусами, но страдает качество...
Ну так а в библиотеке той, думете что-то другое используется?
Просто там уже все реализовано и отлажено, почему не воспользоваться.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер Image изменяется на размер картинки, а сама она рисуется на области первой картинки RPGer Мультимедиа в Delphi 6 20.10.2008 19:54
Поворот картинки delphin100 Мультимедиа в Delphi 5 14.04.2008 10:43
Поворот матрицы Cartman18 Помощь студентам 2 07.02.2008 11:11
timage, поворот ERASERROR Мультимедиа в Delphi 1 05.02.2008 12:10
Поворот картинки PAVEL315 Общие вопросы Delphi 3 24.12.2006 12:47