Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

Image   Найти похожие ветки 

 
Rim   (2004-02-24 23:23) [0]

Подскажите пожалуйста,как Image повернуть на 45 и 90 градусов.


 
Defunct ©   (2004-02-24 23:27) [1]

Там есть массив точек Images.Canvas.Pixels[x,y], вот их и переворачивайте. Процедуру поворота прийдется придумать самостоятельно.


 
Rim   (2004-02-25 16:45) [2]

Мне сложновато. Может кто поможет?


 
Palladin ©   (2004-02-25 16:47) [3]

Сколько?


 
Rim   (2004-02-25 16:50) [4]

Сколько? Что?


 
Ega23 ©   (2004-02-25 16:53) [5]

Сколько? Что?

Денег сколько?


 
Sandman25+1   (2004-02-25 16:55) [6]

Скачайте бесплатную библиотеку Graphics32. Там есть отличные компоненты для просмтра изображений. В том числе и повороты реализваны.


 
Ega23 ©   (2004-02-25 16:58) [7]

Хотя где-то я видел как битмап крутить. Но вот где - никак вспомнить не могу. Может в 7-й Делфе...


 
Palladin ©   (2004-02-25 17:03) [8]

вспониминаем школьною тригонометрию... ну а на 90 градусов трудно разве x с y поменять? хотя смотря в какую сторону...


 
MBo ©   (2004-02-25 17:09) [9]

XNew=Xc+(XOld-Xc)*CosFi+(YOld-Yc)*SinFi
YNew=Yc-(XOld-Xc)*SinFi+(YOld-Yc)*CosFi

но лучше из этих формул выразить XOld и YOld и для каждой точки повернутой картинки находить соотв. точку из исходной (чтобы не было дырок)

для углов 90*N - как Palladin сказал.


 
Ega23 ©   (2004-02-25 17:14) [10]

Не, алгоритм кручения понятен. А я где-то готовый метод видел (или функцию?). Причём не от "левых" производителей.
Хотя может это мои глюки...


 
Sandman25+1   (2004-02-25 17:16) [11]

Не советую через Pixels работать - слишком медленно.


 
WebErr ©   (2004-02-25 17:20) [12]

для 45:

k = 1/sqrt(2)
kdx = k*(x - x0) // x0 - середина по x
kdy = k*(y - y0) // y0 - середина по y
x1 = kdx - kdy + xc // x1 - новый x
y1 = kdx + kdy + yc // y1 - новый y

xc и yc - домашнее задание для начинающих
для 90:

dx = x - x0
dy = y - y0
x1 = dy + xc
y1 = dx + yc

гы! - линейная алгебра и геометрия - том 1. :))))


 
MBo ©   (2004-02-25 17:21) [13]

>Sandman25
В статьи загляни

>Ega23
В NT-системах PlgBlt или SetWorldTransform с XForm вращения


 
WebErr ©   (2004-02-25 17:23) [14]

Лучше всего работать через массив байтов, а потом stretch"ать :)))) А видел ты нечто подобное в библиотеке DelphiX Direct3D либо в OpenGL. Мне ни то, ни другое не нравится - предпочитаю создавать свои 3D модули! :))))


 
Sandman25+1   (2004-02-25 17:24) [15]

[13] MBo © (25.02.04 17:21)

Не нашел. За какую дату?


 
MBo ©   (2004-02-25 17:28) [16]

>Sandman25+1
2 страница. "Поставить точку"


 
Sandman25+1   (2004-02-25 17:33) [17]

[16] MBo © (25.02.04 17:28)

Спасибо!
Неслабый класс...


 
Serge ©   (2004-02-25 17:38) [18]

Взято с http://www.sources.ru/delphi/graphics/rotate_bitmap.shtml

Как повернуть Bitmap на любой угол

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;


 
WebErr ©   (2004-02-25 17:43) [19]

Прочти внимательно, но сделай проще! У каждого свои потребности, на каждый отдельно взятый пример! :))))


 
Rim   (2004-02-26 16:56) [20]

Спасибо всем!


 
WebErr ©   (2004-02-26 17:01) [21]

Always welcome! :))))



Страницы: 1 вся ветка

Текущий архив: 2004.03.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
6-25836
Fants
2003-12-01 15:33
2004.03.09
Ошибка idSMTP 554 no valid RCPT address specified


3-25697
Yrtimd
2004-02-10 18:49
2004.03.09
Как в ehDbGrid узнать, какую запись выбрал пользователь?


11-25725
avakss
2003-06-19 18:42
2004.03.09
KOLFTP


4-25960
aser
2004-01-04 10:36
2004.03.09
как отловить завершение потока?


14-25898
DDA
2004-02-17 14:05
2004.03.09
Защита от RegShot , RegSnap