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

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

DrawRotate [Delphi, Windows]


Nostradamus ©   (2002-10-12 21:53:00) 

Как перевернуть картинку не находящуюся в TDXImageList, а просто подгружаемую мной вручную. Нашёл ещё DrawRoate у TDXDraw.Surface, но чё-то оно у меня не переварачивает ничего... :-(


MBo   (2002-10-21 07:39:00) [1]

>Rouse_
для 90*N градусов этот алгоритм невыгоден по скорости и может давать неприятный сдвиг на пиксел из-за ошибок округления.


Rouse_   (2002-10-21 07:31:00) [2]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035159435&n=9

Желаю успехов


MBo   (2002-10-21 07:02:00) [3]

В StretchBlt используется не Bitmap.Handle, а Bitmap.Canvas.Handle - но этот метод подходит для горизонтального или вериткального отражения.
Для поворота на 90*N градусов можно использовать присвоение цветов, подобное описанное Nostradamus, для увеличения скорости лучше пользоваться Scanline.
Алгоритм для поворота неквадратной - если Src размером M*N, то
результат N*M


Nostradamus   (2002-10-20 23:16:00) [4]

Вот набросал код для переворота на 90 градусов попиксельно. Код работает, НО только для квадратных рисунков, а вот для рисунков произвольного размера чё-то никак алгоритм не шифрану...


procedure TMain.Rotate90n(const Src : TBitmap; var Dest: TBitmap; K: Integer);
var
I, J, N : Integer;
B : TBitmap;
begin
if (K < 1) or (K > 3) or (not Assigned(Src)) or (not Assigned(Dest)) then
Exit;

B := TBitmap.Create;
B.Assign(Src);

for N := 1 to K do begin
Dest.Width := B.Width;
Dest.Height := B.Height;

for I := 0 to Dest.Width do
for J := 0 to Dest.Height do
Dest.Canvas.Pixels[I, J] := B.Canvas.Pixels[J, B.Height + 1 - I];

B.Assign(Dest);
end;

B.Free;
end;


Nostradamus   (2002-10-20 21:40:00) [5]

>Gandalf
Ну дык как с этими пикселями работать чтоб картинку на 90 градусов перевернуть???
Я могу предположить что нужно просто в цикле пройтись по всем пикселям нарисовать их в нужном месте на другом битмапе, но как то это звучит коряво, может есть способ получше?


Gandalf   (2002-10-20 21:06:00) [6]

>Хотя... хм... всё равно не совсем то оно таким образом делает >флип как бы, а мне нужно её перевернуть на 90 градусов.

Извини но ты просил (см. выше)

>...Как перевернуть картинку не находящуюся
^^^^^^^^^^^
ПОвернуть (Rotate,Revolve) и ПЕРЕвернуть (Mirrow,Flip) - это разные вещи.
А девяносто градусов это тоже не сложно - но тут тебе CopyRect не поможет - надо по пикселям работать.


Nostradamus   (2002-10-20 20:29:00) [7]

Хотя... хм... всё равно не совсем то оно таким образом делает флип как бы, а мне нужно её перевернуть на 90 градусов.


Nostradamus   (2002-10-20 20:05:00) [8]

>Gandalf
Огромное спасибо - сработало.


Gandalf   (2002-10-18 22:36:00) [9]

Попробуй:
B.Canvas.CopyRect(Rect(0,142,144,0),TempBmp.Canvas,Rect(0,0,144,142));


Nostradamus   (2002-10-18 21:28:00) [10]

>Mbo
Блин не знаю, уже чё только не перепробовал. Чё-то я торможу. Подскажи что я тут не так делаю???


var
B : TBitmap;
TempBmp : TBitmap;
begin

...
TempBmp := TBitmap.Create;
TempBmp.Width := 144;
TempBmp.Height := 142;
TempBmp.LoadFromFile(FileName);
B := TBitmap.Create;
B.Width := 144;
B.Height := 142;

StretchBlt(B.Handle, 0, 0, 144, -142, TempBmp.Handle, 0, 0, 144, 142, SRCCOPY);
...

end;


MBo   (2002-10-18 16:48:00) [11]

StretchBlt c отриц. высотой


Nostradamus   (2002-10-18 16:46:00) [12]

Да Bmp ну или Dib (хотя по большому счёту какая разница)


MBo   (2002-10-14 08:04:00) [13]

Какую именно картинку надо перевернуть? Bmp?


Nostradamus   (2002-10-12 23:15:00) [14]

Только что загрузил FastLib при попытке переворота и прорисовке графики вообще вся прога виснет.


Наверх

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