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