Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];

Вниз

Вращаем TBitmap.   Найти похожие ветки 

 
SergeyVP   (2002-03-04 07:04) [0]

Уважаемые Мастера!
Как можно повращать Bitmap?
Может быть есть такие процедуры?
А если самому написать - то какой алгоритм?


 
MBo   (2002-03-04 08:14) [1]

если для NT-семейства, то исследуй SetWorldTransform
Если и для Win-9x - придется руками


 
SergeyVP   (2002-03-04 08:36) [2]

А если руками, то какой алгоритм?
Пробовал для каждой точки вычислять новое местоположение - в результате (за счет округления) появляются дырки в изображении.


 
MBo   (2002-03-04 08:47) [3]

для 16m цветов

function TForm1.BmpRot(const B: TBitmap;fi:integer):TBitmap;
type
TRGBTripleArray = array[0..1023] of TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
var
x0,y0,i,j,x1,y1,x11,y11,x2,y2:integer;
ht,wd,newht,newwd:integer;
cfi,sfi: double;
sline1,sline2: pRGBTRipleArray;
BEGIN
sfi:=sin(degtorad(fi));
cfi:=cos(degtorad(fi));
ht:=b.height;
wd:=b.width;
newwd:=abs(round(ht*sfi))+abs(round(wd*cfi));
newht:=abs(round(wd*sfi))+abs(round(ht*cfi));
Result:=TBitmap.create;
Result.Width:=newwd;
Result.Height:=newht;
Result.PixelFormat:=pf24bit;
x0:=wd div 2;
y0:=ht div 2;
for j :=newht-1 downto 0 do begin
sline2 := Result.scanline[j];
y1:= 2*(j-(newht-ht) div 2 -y0)+1;
for i := newwd-1 downto 0 do begin
x1:=2*(i-(newwd-wd) div 2 -x0)+1;
x2 :=round(x1 * cfi - y1 * sfi);
y2 :=round(x1 * sfi + y1 * cfi);
x11:=(x2-1) div 2 +x0;
y11:=(y2-1) div 2 +y0;
if (x11>=0)and(x11<wd)and(y11>=0)and(y11<ht) then begin
sline1 := b.scanline[y11];
sline2[i] := sline1[x11];
end;
end;
end;
end;


 
SergeyVP   (2002-03-04 09:10) [4]

Спасибо - работает.
Плз, нормальным языком объясни как она вращает?


 
MBo   (2002-03-04 09:26) [5]

x2 и y2 -получаются по обычным формулам поворота,
при написании пришлось повозиться со смещением (так как делал процедуру поворота без обрезания уголков - таких примеров в Инете много) - это вычисление X1 и Y1 - начальных точек, соответствующих повернутым.


 
MBo   (2002-03-04 12:45) [6]

а пред. ответе должно быть >> x11 и y11- начальных точек

хитрость в следующем - чтобы не было дырок, берется КАЖДАЯ точка новой картинки и ищется соответствующая точка старой.
для некоторого ускорения можно сначала определять границы новой картинки и циклы делать в их пределах, тогда и последний if не нужен будет.



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

Форум: "Основная";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
7-57531
Snake2000
2001-12-17 16:35
2002.03.18
COM rate


3-57327
Quaker
2002-02-19 11:24
2002.03.18
Ошибки Oracle


3-57292
ASM
2002-02-18 22:52
2002.03.18
Народ хэлп нужен! Как в ComboBox е сделать:


14-57492
M-A-B
2002-02-01 12:14
2002.03.18
СОМ-порт


3-57311
draculenok
2002-02-19 12:51
2002.03.18
COmbobox .....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский