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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2012, 22:08   #1
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию ВЫВОД повернутого изображения

Я пишу программу, которая должна выводить разные изображения
под разными углами.
Я нашел 2 разных кода, но они изменяют толко сами изображения,
а мне надо вывести изображение под углом на, допустим, канвас формы.
Как это реализовать?
вот куски кода
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var M:TXFORM;
    a:Double;
    HDC:THandle;
    b:TBitmap;
begin
   B := TBitMap.Create;
   B.Width:=Image1.Width  ;
      B.Height:=Image1.Height  ;
      B.Canvas.Draw(0,0,Image1.Picture.Graphic);

   hDc := image1.Canvas.Handle;
   SetGraphicsMode(hDc, GM_ADVANCED);

   FILLCHAR(M,SIZEOF(M),0);
   M.eM11 := 1;
   M.eM12 := 0;
   M.eM21 := 0;
   M.eM22 := 1;
   M.eDx := -B.Width div 2;
   M.eDy := -B.Height div 2;
   SetWorldTransform(hDc, M);

   a := PI/6;
   fillChar(M, sizeOf(M), 0);
   M.eM11 := Cos(a);
   M.eM12 := Sin(a);
   M.eM21 := -Sin(a);
   M.eM22 := Cos(a);
   M.eDx := 0;
   M.eDy := 0;
   ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

   M.eM11 := 1;
   M.eM12 := 0;
   M.eM21 := 0;
   M.eM22 := 1;
   M.eDx := B.Width div 2;
   M.eDy := B.Height div 2;
   ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

   image1.Canvas.Draw(0, 0, b);
// ??? BitBlt(hDc, 0, 0, image1.Width, image1.Height, B.Canvas.Handle, 0, 0, SRCCOPY);
end;
Код:
var M:TXFORM;
    a:Double;
    HDC:THandle;
    b:TBitMap;
    M1, M2, k : double;
begin
   B := TBitMap.Create;
   try
      B.Width:=Image1.Width;
      B.Height:=Image1.Height;
      B.Canvas.Draw(0,0,Image1.Picture.Graphic);

      hDc := image1.Canvas.Handle;
      SetGraphicsMode(hDc, GM_ADVANCED);

      // translate
      fillChar(M, sizeOf(M), 0);
      M.eM11 := 1;
      M.eM12 := 0;
      M.eM21 := 0;
      M.eM22 := 1;
      M.eDx := -B.Width div 2;
      M.eDy := -B.Height div 2;
      SetWorldTransform(hDc, M);

      // scale
      fillChar(M, sizeOf(M), 0);
      M1 := Min(Image1.Width, Image1.Height);
      M2 := sqrt(sqr(b.Width) + sqr(b.Height));
      k := M1/M2;
      M.eM11 := k;
      M.eM12 := 0;
      M.eM21 := 0;
      M.eM22 := k;
      M.eDx := 0;
      M.eDy := 0;
      ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

      // rotate
      a := PI/6;
      fillChar(M, sizeOf(M), 0);
      M.eM11 := Cos(a);
      M.eM12 := Sin(a);
      M.eM21 := -Sin(a);
      M.eM22 := Cos(a);
      M.eDx := 0;
      M.eDy := 0;
      ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

      // translate
      M.eM11 := 1;
      M.eM12 := 0;
      M.eM21 := 0;
      M.eM22 := 1;
      M.eDx := Image1.Width div 2;
      M.eDy := Image1.Height div 2;
      ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

      image1.Canvas.Draw(0, 0, b);
   finally
      b.free;
   end;
end;
Или хотя бы объясните,
как работает этот код, пожалуйста.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 03.01.2012, 19:58   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Вроде бы сам разобрался
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var M:TXFORM;
    a:Double;
    HDC:THandle;
    b:TBitmap;
    h,w:integer;
    T:TDateTime;
begin
  T:=Time;
   B := TBitMap.Create;
   B.Width:=Image1.Width  ;
      B.Height:=Image1.Height  ;
      B.Canvas.Draw(0,0,Image1.Picture.Graphic);
    h:=image1.Height;
   w:=Image1.Width;
   Image2.Width:=round(cos(a)*w+sin(a)*h);
   Image2.Height:=Image1.Width;
   hDc := image2.Canvas.Handle;
   SetGraphicsMode(hDc, GM_ADVANCED);

   FILLCHAR(M,SIZEOF(M),0);
   M.eM11 := 1;
   M.eM12 := 0;
   M.eM21 := 0;
   M.eM22 := 1;
   M.eDx := -B.Width div 2;
   M.eDy := -B.Height div 2;
   SetWorldTransform(hDc, M);

   a := PI/6;
   fillChar(M, sizeOf(M), 0);
   M.eM11 := Cos(a);
   M.eM12 := Sin(a);
   M.eM21 := -Sin(a);
   M.eM22 := Cos(a);
   M.eDx := 0;
   M.eDy := 0;
   ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

   M.eM11 := 1;
   M.eM12 := 0;
   M.eM21 := 0;
   M.eM22 := 1;
   M.eDx := B.Width div 2;
   M.eDy := B.Height div 2;
   ModifyWorldTransform(hDc, M, MWT_RIGHTMULTIPLY);

   image2.Canvas.Draw(36,36, b);
   Form1.Caption:=inttostr(MilliSecondsBetWeen(T,Time));
// ??? BitBlt(hDc, 0, 0, image1.Width, image1.Height, B.Canvas.Handle, 0, 0, SRCCOPY);
end;
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод случайного изображения Dима PHP 1 16.08.2010 02:14
Некорректный вывод изображения Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 24.07.2010 00:12
вывод изображения асемблер eXen_fm Фриланс 3 07.06.2010 09:55
BitBlt, вывод изображения zotox Win Api 5 22.04.2010 21:43
Вывод изображения из листбокса (комбобокса) dsapa Microsoft Office Excel 6 11.10.2008 22:58