Вниз
Скачать: CL | DM;

Вращаем 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.006 c
6-57489
IrviS
2001-12-31 21:39
2002.03.18
Репликация


1-57346
Alexklink
2002-03-04 11:39
2002.03.18
Проверка орфографии


3-57303
Сержик
2002-02-18 10:45
2002.03.18
Установка InterBase Client


1-57382
Kettle of delphi
2002-03-01 12:58
2002.03.18
Подскажите пожалуйста, как правильно создавать клоны объекта, а потом работать с каждым из них. В вопросе есть маленький пример моей проблемы...


1-57406
Сергей Ф
2002-02-20 04:38
2002.03.18
Как использовать Сишную dllку? Есть исходник. Нужно её вызывать из Дельфи и получать ответ. В Си я не очень. Подскажите пожалуйтса!




   Наверх