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

Вниз

Тут еще такой вопросец возник трансформирование Bitmap ov   Найти похожие ветки 

 
Kost   (2001-12-20 16:08) [0]

Как повернуть Bitmap на заданный угол?


 
vbazik   (2001-12-23 16:27) [1]

procedure povorot(Im1 ,Im2: TBitmap ;xc,yc,angle:double);
// xc,yc-координаты центра вращения,
//angle-угол в радианах
function Pixel_Size(Im : TBitmap ): byte ;// Возвращает размер пиксела
//картинки в байтах
var
pix_size : byte ;
begin
case Im.PixelFormat of
pf24bit: pix_size := 3 ;
pf8bit : pix_size := 1 ;
pf16bit : pix_size := 2 ;
pf32bit : pix_size := 4 ;
else
pix_size:= 0 ;
end;
Pixel_Size := pix_size ;
end;


procedure RotateXY(xc,yc,angle:double;var x,y :integer );
var
tmp : double ;
x_ ,y_ : double ;
cos_ ,sin_ : double ;
begin
x_ := x - xc ;
y_ := y - yc ;
tmp := x_ ;
asm // ASM-код для одновременного вычисления SIN(angle) и COS(angle)
fld angle ; // на арифметическом сопроцессоре 80Х87
fsincos ; // <---- Ф-ция вычисления SIN/COS (angle)
fstp cos_ ;// cos_ := cos(angle);
fstp sin_ ;// sin_ := sin(angle) ;
end;
x_ := x_ * cos_ - y_ * sin_ ;
y_ := y_ * cos_ + tmp * sin_ ;
x := round(x_ + xc );
y := round(y_ + yc );
end;//proc RotateXY

procedure find_offset
(Im :TBitmap ; xc,yc,angle :double ;var xoff , yoff , xw , yh :integer);
// процедура find_offset определяет размер повёрнутой картинки
// (xc , yc) центр поворота angle - угол (в рад.) Im - исходная
// неповёрнутая картинка
// xoff u yoff определяют насколько надо сместить неповёрнутую
// картинку что бы она "вписалась"в повёрнутую
// xw,yh габариты "повёрнутой" картинки
const
max_int = 32567 ;
var
i : integer ;
xrab,yrab : integer ;
xmin,ymin :integer ;
xmax,ymax :integer ;
begin
xmin := max_int ;
ymin := max_int ;
xmax := -max_int ;
ymax := -max_int ;

for i:= 1 to 4 do
begin
case i of
1: begin xrab := 0;yrab := 0 ; end;
2: begin xrab := 0 ; yrab := Im.Height ; end;
3: begin xrab := Im.Width ; yrab := 0 ; end;
4: begin xrab := Im.Width ; yrab := Im.Height ; end;
end;//case
//rotation calculation
RotateXY(xc,yc,angle, xrab , yrab ) ;
if xrab > xmax then xmax := xrab ;
if yrab > ymax then ymax := yrab ;
if xrab < xmin then xmin := xrab ;
if yrab < ymin then ymin := yrab ;
end;// for i
xoff := xmin ; ////////////////?
yoff := ymin ;
xw := xmax - xmin ;
yh := ymax - ymin ;
end; //proc Find_Offset

var // proc povorot
i , j , h , w ,ii ,i3: integer ;
x_int,y_int : longint ;
R , G , B ,Intens , size_ : byte ;
pntr : PBytearray ; // указатель на адреса памяти в кот. находится Im1
pntr2 : PBytearray ; // указатель на адреса памяти в кот. находится Im2
xoff,yoff : integer ;
xw,yh : integer ;
line_size1,line_size2 : integer ;// длина строк изображений Im1 , Im2 в байтах
index1 , index2 :integer;// определяет смещения от начала строк в Im1 , Im2
// соотв. в байтах


 
vbazik   (2001-12-23 16:29) [2]

/// продолжение
begin

h := Im1.Height ; w := Im1.Width ;

h := h - 1 ;
w := w - 1 ;

find_offset( Im1 , xc , yc , angle , xoff , yoff ,xw ,yh );
Im2.Height := yh ; Im2.Width := xw ;
size_ := Pixel_Size( Im1 );
if not(size_ in [1..4])then
begin MessageBox(0,"Im1 : Unsupported type of bitmap","Error",0);exit; end;

Im2.PixelFormat := Im1.PixelFormat ;
Im2.Palette := Im1.Palette ;
line_size1 := (w+1) * size_ ;
if (line_size1 mod 4 <> 0)
then line_size1 := line_size1 + 4 - line_size1 mod 4 ;// т.к. размер
//строки изображения в памяти дополняется до кратного 4
line_size2 := xw * size_ ;
if (line_size2 mod 4 <> 0)
then line_size2 := line_size2 + 4 - line_size2 mod 4 ;

pntr2 := Im2.ScanLine[0] ;// получение указателя на начало 0 строки
pntr := Im1.ScanLine[0] ;
for j := 0 to yh-1 do
begin
index2 := -line_size2 * j ;// определение смещения j строки в памяти
//относительно 0 для Im2
i3 := - size_ ;
for i := 0 to xw-1 do
begin
x_int := i ; y_int := j ;

i3 := i3 + size_ ;

x_int := x_int + xoff ;
y_int := y_int + yoff ;
RotateXY(xc,yc,angle,x_int ,y_int );

if (x_int<0)or(y_int<0)or(y_int>h)or(x_int>w ) //Out of bounds !
then continue;
index1 := -line_size1 * y_int ;
ii:= (x_int) * size_ ;
// Копирование пиксела
R := pntr[ii + index1 ] ; G := 0 ; B := 0 ; Intens := 0 ;
if size_>1 then G := pntr[ii + index1 + 1] ;
if size_>2 then B := pntr[ii + index1 + 2] ;
if size_>3 then Intens := pntr[ii + index1 + 3] ;
try
pntr2 [i3 + index2 ] := R ;
if size_>1 then pntr2 [i3 + index2 + 1] := G ;
if size_>2 then pntr2 [i3 + index2 + 2] := B ;
if size_>3 then pntr2 [i3 + index2 + 3] := Intens ;
except
// Конец копирования пиксела
end;
end; // for i
end; // for j

Im2.ReleasePalette ;

end; // proc povorot


?????????????????????????????????????????

Встречный вопрос знатокам - в D3 под W-98 при попытке разворота больших изображений дает Out of resurs :-( Под NT4.0 все О.К. В чем причина
Кто разберется - киньте на мыло: vbazik@mail.ru
Заранее спасибо :-)
?????????????????????????????????????????



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

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

Наверх




Память: 0.46 MB
Время: 0.003 c
3-28433
kd
2001-12-10 08:03
2002.01.10
SQL


1-28510
USAtyj
2001-12-21 12:56
2002.01.10
AV при вызове HeapAlloc


6-28518
Sregey
2001-10-17 14:13
2002.01.10
О ServerWinSocket


1-28502
Серега
2001-12-16 19:01
2002.01.10
I/O Error 103 и подавление системного сообщения.


3-28421
NLO
2001-12-07 12:29
2002.01.10
Выполнить start transaction commit в процедуре InterBase 6





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