Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поворот и масштабирование Bitmap [WinXP]


CMOS ©   (2007-07-05 08:09:00) 

Нужно не ВЫВЕСТИ Bitmap повернутым, а преобразовать?
Желательно чтобы работало с 1-битными картинками.


Tack   (2007-07-07 12:05:00) [1]

http://www.graphics32.org/wiki/


CMOS   (2007-07-05 21:28:00) [2]

Я не мастер в С++, но по-моему перевел правильно. Поправьте, если не так.

procedure TForm1.FormPaint(Sender: TObject);
begin
picture:= TBitmap.Create; buffer:= TBitmap.Create;
angle:= pi/6;
picture.LoadFromFile('image.bmp');
buffer.LoadFromFile('image.bmp');//для одинакового размера и цвета
Scale:= 1.0/(1.0+0.2*cos(angle*4.0)); //коэффициент yвеличения каpтинки
SinA:= sin(angle); CosA:= cos(angle);
// какyю точкy каpтинки надо изобpажать в веpхней левой точке экpана?
// (использyются вычисления с фиксиpованной точкой в фоpмате 16.16)
x0:= Round(160.0+scale*(-160.0*CosA+100.0*1.2*SinA))*65536;
y0:= Round(100.0+scale*(-100.0*CosA-160.0*SinA/1.2))*65536;
// на сколько надо сместиться по каpтинке пpи пеpемешении
// по экpанy на пиксель влево
xdx:= Round(scale * CosA*65536);
xdy:= Round(scale * SinA*65536.0/1.2);
// на пиксель вниз
ydx:= Round(-scale*SinA*65536.0*1.2);
ydy:= Round(scale*CosA*65536.0);

for y:=0 to picture.Height-1 do
begin
// x0, y0 - кооpдинаты на каpтинке начала текyщей стpоки сканиpования
// x1, y1 - кооpдинаты на каpтинке текyщей pисyемой точки
 x1:= x0;
 y1:= y0;
 for x := 0 to picture.Width-1 do
 begin
// xp, yp - кооpдинаты на каpтинке текyщей pисyемой точки (фоpмат 16:0)
   xp:= x1 shr 16;
   yp:= y1 shr 16;
   // "клиппинг"
   if (xp>=0) or (xp<=picture.Width-1) or (yp>=0) or (yp<=picture.Height-1) then
     buffer.Canvas.Pixels[y, x]:= picture.Canvas.Pixels[yp, xp]
   else buffer.Canvas.Pixels[y, x]:=  clblack;
// пеpедвижение вдоль стpоки сканиpования
   Inc(x1, xdx);
   Inc(y1, xdy);
 end;
 // пеpеход к новой стpоке сканиpования
 Inc(x0, ydx);
 Inc(y0, ydy);
end;
Canvas.Draw(10,10,buffer);
end;

Не работает как с цветными так и с монохромными. Просто на выходе черный экран.


Инс   (2007-07-05 10:42:00) [3]

SetWorldTransform


Однокамушкин   (2007-07-05 08:25:00) [4]

http://algolist.manual.ru/graphics/rotate.php


Наверх

Титульная страница Поиск, карта сайта Написать письмо