Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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
Заранее спасибо :-)
?????????????????????????????????????????




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




Наверх





Память: 0.73 MB
Время: 0.023 c
1-28458           Aleksandr             2001-12-21 14:33  2002.01.10  
Как корректно уничтожить из дестрактора компоненты ScrollBar


14-28544          Abajun                2001-11-16 09:38  2002.01.10  
Шифровка


1-28466           GorA                  2001-12-21 15:18  2002.01.10  
T(Rx)RichEdit


1-28477           Kost                  2001-12-22 10:02  2002.01.10  
Как поворвчивать bitmap


14-28533          anod                  2001-11-15 20:58  2002.01.10  
Блок питания жужит