Форум: "Игры";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизDrawRotate Найти похожие ветки
← →
Nostradamus (2002-10-12 21:53) [0]Как перевернуть картинку не находящуюся в TDXImageList, а просто подгружаемую мной вручную. Нашёл ещё DrawRoate у TDXDraw.Surface, но чё-то оно у меня не переварачивает ничего... :-(
← →
Nostradamus (2002-10-12 23:15) [1]Только что загрузил FastLib при попытке переворота и прорисовке графики вообще вся прога виснет.
← →
MBo (2002-10-14 08:04) [2]Какую именно картинку надо перевернуть? Bmp?
← →
Nostradamus (2002-10-18 16:46) [3]Да Bmp ну или Dib (хотя по большому счёту какая разница)
← →
MBo (2002-10-18 16:48) [4]StretchBlt c отриц. высотой
← →
Nostradamus (2002-10-18 21:28) [5]>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;
← →
Gandalf (2002-10-18 22:36) [6]Попробуй:
B.Canvas.CopyRect(Rect(0,142,144,0),TempBmp.Canvas,Rect(0,0,144,142));
← →
Nostradamus (2002-10-20 20:05) [7]>Gandalf
Огромное спасибо - сработало.
← →
Nostradamus (2002-10-20 20:29) [8]Хотя... хм... всё равно не совсем то оно таким образом делает флип как бы, а мне нужно её перевернуть на 90 градусов.
← →
Gandalf (2002-10-20 21:06) [9]>Хотя... хм... всё равно не совсем то оно таким образом делает >флип как бы, а мне нужно её перевернуть на 90 градусов.
Извини но ты просил (см. выше)
>...Как перевернуть картинку не находящуюся
^^^^^^^^^^^
ПОвернуть (Rotate,Revolve) и ПЕРЕвернуть (Mirrow,Flip) - это разные вещи.
А девяносто градусов это тоже не сложно - но тут тебе CopyRect не поможет - надо по пикселям работать.
← →
Nostradamus (2002-10-20 21:40) [10]>Gandalf
Ну дык как с этими пикселями работать чтоб картинку на 90 градусов перевернуть???
Я могу предположить что нужно просто в цикле пройтись по всем пикселям нарисовать их в нужном месте на другом битмапе, но как то это звучит коряво, может есть способ получше?
← →
Nostradamus (2002-10-20 23:16) [11]Вот набросал код для переворота на 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;
← →
MBo (2002-10-21 07:02) [12]В StretchBlt используется не Bitmap.Handle, а Bitmap.Canvas.Handle - но этот метод подходит для горизонтального или вериткального отражения.
Для поворота на 90*N градусов можно использовать присвоение цветов, подобное описанное Nostradamus, для увеличения скорости лучше пользоваться Scanline.
Алгоритм для поворота неквадратной - если Src размером M*N, то
результат N*M
← →
Rouse_ (2002-10-21 07:31) [13]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035159435&n=9
Желаю успехов
← →
MBo (2002-10-21 07:39) [14]>Rouse_
для 90*N градусов этот алгоритм невыгоден по скорости и может давать неприятный сдвиг на пиксел из-за ошибок округления.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c