![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поворот и масштабирование 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