Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.10;
Скачать: CL | DM;

Вниз

Image   Найти похожие ветки 

 
Dima_   (2002-05-29 15:40) [0]

Как повернуть изображение на определенный угол. Помогите.


 
Sniffer   (2002-05-29 15:43) [1]

С помощью OpenGl


 
Игорь Шевченко ©   (2002-05-29 15:46) [2]

Или GDI+

Над каждым пикселем надо выполнить матричное преобразование,
матрицу только забыл :((


 
MBo ©   (2002-05-29 15:59) [3]

16) Вращение Bitmap (24-bit)

function TForm1.BmpRot(const B: TBitmap;fi:integer):TBitmap;
type
TRGBTripleArray = array[word] 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;

procedure TForm1.Button1Click(Sender: TObject);
var b:tbitmap;
begin
b:=tbitmap.create;
b.LoadFromFile("e:\4.bmp");
image1.Picture.assign(BmpRot(b,30));
b.free;
end;


 
ded_di ©   (2002-05-31 11:53) [4]

В продолжение темы.
Мне нужно было преобразовать битмап в параллелограм, МВо посоветовал PlgBlt, но пока я с ним разбирался заметил, что для 98 несапортед. Глядя на его ф-цию поворота написал я свою

function TForm1.BmpPar(const B: TBitmap;fi:integer):TBitmap;
type
TRGBTripleArray = array[word] of TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
var
ht,wd,newht,newwd,delta1,delta2,j,i:integer;
cfi,sfi: double;
sline1,sline2: pRGBTRipleArray;
BEGIN
sfi:=sin(degtorad(fi));
cfi:=cos(degtorad(fi));
ht:=b.height;
wd:=b.width;
delta1:=abs(round(ht*cfi/sfi));
newwd:=wd + delta1;
newht:=ht;
Result:=TBitmap.create;
Result.Width:=newwd;
Result.Height:=newht;
Result.Transparent:=true;
Result.PixelFormat:=pf24bit;

for j:=0 to newht-1 do begin
delta2:=delta1-abs(round((j+1)*cfi/sfi));
sline2 := Result.scanline[j];
sline1 := b.scanline[j];
for i:=wd-1 downto 0 do
sline2[i+delta2]:=sline1[i];
end;
end;

И теперь вопрос. Как сделать, чтоб углы, которые остались (куда картинка не попала) были прозрачными? Спасибо.



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

Текущий архив: 2002.06.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-30908
Alexey_
2002-05-17 17:38
2002.06.10
Как удалить директорию под Windows NT


4-31049
CrazyTemo
2002-04-09 10:33
2002.06.10
processor frequency


6-30937
Kuzmich
2002-03-28 16:01
2002.06.10
Как работать с БД из Веб-сервиса?


1-30777
Danger
2002-05-30 23:40
2002.06.10
Работа с Вордовскими файлами(doc)


14-30989
Chaynik___
2002-05-07 19:31
2002.06.10
Декомпиляторы