Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
6-64251
BoB
2003-01-27 11:06
2003.03.20
DialUp соединения


14-64378
HanIP
2003-03-05 19:34
2003.03.20
quickreport


3-63977
Vassiliy
2003-02-27 19:35
2003.03.20
dbExpress и TBcd


1-64138
Felix
2003-03-07 11:14
2003.03.20
TreeView


3-63958
Kurt_
2003-02-27 14:53
2003.03.20
если а одной транзакции (в Адо между BeginTransaction и CommitTra





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский