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

Вниз

Памагите!!! Надо крутить битмап   Найти похожие ветки 

 
Deztiny   (2002-05-13 21:28) [0]

Надо битмап повернуть на оперделённый угол!!!!!


 
MBo ©   (2002-05-14 06:54) [1]

в Win2K - SetWorldTransform


 
Deztiny   (2002-05-14 07:38) [2]

А ежели прога должна работать не только у win2k а на любом компе
то как???


 
MBo ©   (2002-05-14 07:51) [3]

уголки обрезать?


 
Deztiny   (2002-05-14 08:06) [4]

нет просто повернуть относительно центра битмап в форме круга


 
MBo ©   (2002-05-14 08:16) [5]

>битмап в форме круга
в форме круга - это круто ;)

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

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;

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;


 
Deztiny   (2002-05-14 19:33) [6]

Молодцы, ребята. Хватит под моим ником общаться!


 
Evgeny ©   (2002-05-15 06:04) [7]

А если не относительно центра, а вокруг вертикальной оси?


 
MBo ©   (2002-05-15 07:00) [8]

Тогда это называется отражение и делается элементарно - в ScanLine обмениваем симметрично расположенные элементы


 
Evgeny ©   (2002-05-15 07:49) [9]

Нет немного не то. Ведь при вращении картинка будет становится уже (в итоге сходя на вертикальную полосу). Соответственно часть изображения будет теряться.
|---------| было |----| будет
| | | |
| | | |
|---------| |----|
Как выбрать какие байты выбросить, а какие оставить?


 
MBo ©   (2002-05-15 08:09) [10]

Теперь понял, что ты имеешь в виду.
Надо пересчитывать координаты по X, например поворачиваем на fi радиан
ширина будет abs(round(oldwidth*cos(fi)));
сдвиг начала ashift:=(oldwidth-newwidth)/2
и т.д.




 
Evgeny ©   (2002-05-15 13:05) [11]

Спасибо. С учетом ранее приведенного примера - это готовое решение.


 
MBo ©   (2002-05-15 13:24) [12]

Кстати, в описанном вращении вокруг точки важно то, что исходя из координат новой точки рассчитываем, из какой начальной она получается - иначе будут дырки. Для вертикального вращения, думаю, это непринципиально, но уменьшит объем расчетов ввиду меньшей ширины повернутой картинки, надо только аккуратно считать при углах вблизи Pi/2 и -Pi/2, где косинус мал и формула, если не ошибаюсь,
i0:=(i-w1)/cos(fi)+w0
(w-полущирина) будет неточна


 
Evgeny ©   (2002-05-16 05:56) [13]

Еще раз спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
7-50987
Zlo@der
2002-06-27 15:53
2002.09.16
Как узнать серийный номер винта.


1-50671
a413
2002-09-04 16:22
2002.09.16
Как вызвать функцию в DLL из EXE?


7-51007
Alex_i
2002-07-01 19:00
2002.09.16
Удаление ярлыков


8-50873
fore_3
2002-05-16 12:54
2002.09.16
Проблема с перемоткой DVD


7-51009
dlK
2002-07-04 16:44
2002.09.16
TApplicationService и TTimer, парюсь 2-ой день. =((