nette çeşitli rotate func ları buldum..ama genelde 24 bitlik resim üzerinde yapılmış..ancak 1 bitlik bmp leri çevirme söz konusun olunca 24 bitten 1 bite dönüşüm durumunda hatalar oluşuyor..renk sorunları ortaya çıkıyor..
Bundan dolayı direk 1 bitlik resmi çeviren rotata işlemi yapmak gerek..
Not := 90 180 270 gibi dik ve sabit degerler değil 0-90 arası manuel belirlenecek açılar ile dönme işlemi olacak.
1 bitlik bmp resmi Rotate yapmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
vay bee :)
ne başlık açarmışım yaavv kimsenin bi fikri yok
kimse ilgilenmiyormu bu konu ile 


- Master_Yoda
- Üye
- Mesajlar: 35
- Kayıt: 13 Ara 2005 12:57
dik açılarla çevrimde direk data üzerinde (bitmap bitleri) işlem yapmak hem kolay hemde hızlı olur. Ancak açısal bir döndürme işlemi yapılacaksa işlem biraz daha komplex hale gelecektir. Birincisi biraz trigonometri devreye girer. İkincisi hep pixel için trigonometrik hesaplar yaptığınızda oluşacak yeni resimde yuvarlamalardan kaynaklanan boşluklar oluşabilir.
Ayrıca döndürme işlemlerinde oran bozulması yaratmamak istiyorsanız x/y çözünürlük oranında resmi oranlamanız da gerekir.
Hesaplamaları kolaylaştırmak için referans noktasını orta nokta seçmek yerinde olur. Yani resmin w/2 ve h/2 noktasını merkez alıp bu nokta etrafında a açısı ile çevirmek istersek resmin yeni genişliği (wn) = sin(a)*w+cos(a)*h gibi birşey olur ( ben bazen sin ile cos ters kullanırım buda sonuçta sadece dönme yönünü etkiler çok önemli değil) benzer şekilde yeni yükseklik (hn) = cos(a)*w+sin(a)*h gibi olur .
Bu şekilde yeni resmin boyutlarıbelirlendiğinde yeni TBitmap Create edilip orjinal resimdeki her pixel yeni bitmap'a taşınmalıdır .
Bu durumda formatın pek önemi kalmaz sonuçta pixel pixel taşınacak.
Aşağıda kabaca kodladım ama fx ile fy fonksiyonlarının detayına girmedim. Trigonometri ve oran orantı meselesi ..
Var
old,new : TBitmap ;
...
new:=Tbitmap.Create;
new.pixelformat:=old.pixelformat;
new.height:=hn;
new.width:=wn;
for xn:=0 to wn-1 do for yn:=0 to wn-1 do begin
xo:= Fx(xn);
yp:= fy(yn);
new.canvas.pixels[xn,yn]:=old.canvas.pixels[xo,yo];
End;
şeklinde
Ayrıca döndürme işlemlerinde oran bozulması yaratmamak istiyorsanız x/y çözünürlük oranında resmi oranlamanız da gerekir.
Hesaplamaları kolaylaştırmak için referans noktasını orta nokta seçmek yerinde olur. Yani resmin w/2 ve h/2 noktasını merkez alıp bu nokta etrafında a açısı ile çevirmek istersek resmin yeni genişliği (wn) = sin(a)*w+cos(a)*h gibi birşey olur ( ben bazen sin ile cos ters kullanırım buda sonuçta sadece dönme yönünü etkiler çok önemli değil) benzer şekilde yeni yükseklik (hn) = cos(a)*w+sin(a)*h gibi olur .
Bu şekilde yeni resmin boyutlarıbelirlendiğinde yeni TBitmap Create edilip orjinal resimdeki her pixel yeni bitmap'a taşınmalıdır .
Bu durumda formatın pek önemi kalmaz sonuçta pixel pixel taşınacak.
Aşağıda kabaca kodladım ama fx ile fy fonksiyonlarının detayına girmedim. Trigonometri ve oran orantı meselesi ..
Var
old,new : TBitmap ;
...
new:=Tbitmap.Create;
new.pixelformat:=old.pixelformat;
new.height:=hn;
new.width:=wn;
for xn:=0 to wn-1 do for yn:=0 to wn-1 do begin
xo:= Fx(xn);
yp:= fy(yn);
new.canvas.pixels[xn,yn]:=old.canvas.pixels[xo,yo];
End;
şeklinde
- Master_Yoda
- Üye
- Mesajlar: 35
- Kayıt: 13 Ara 2005 12:57
Spor oldu
Formun üzerinde iki adet TImage var biri IM ve herhangi resim yüklü
diğer imnew ve boş her ikisi de autosize true .. Aşağıdaki rutin a açısı ile resmidöndürüyor ancak daha önce sözünü ettiğim sorunlar var. Basit olduğu için sorunları giderirsin heralde
açı radyan cinsinden (pi) yani pi/8 yani 22.5 derece yazdım sola doğru çevirdi
kolay gelsin ..
var
o, b : TBitmap;
a : Double;
xn,yn,xo,yo,dy: Integer;
begin
b:=TBitmap.Create;
Try
a:=pi/8;
o:=im.Picture.Bitmap;
b.Width:=Round(Cos(a)*o.Width+Sin(a)*o.Height);
b.Height:=Round(Sin(a)*o.Width+cos(a)*o.Height);
dy:=Round(Sin(a)*o.Height);
for xo:=0 to o.Width-1 do for yo:=0 to o.Height-1 do begin
xn:=Round(Sin(a)*yo+cos(a)*xo);
yn:=Round(-sin(a)*xo+cos(a)*yo)+dy;
if (xn>=0) and (xn<b.Width) and (yn>=0) and (yn<b.Height)
Then b.Canvas.Pixels[xn,yn]:=o.canvas.Pixels[xo,yo];
end;
imnew.picture.Assign(b);
Finally
b.Free;
End;

Formun üzerinde iki adet TImage var biri IM ve herhangi resim yüklü
diğer imnew ve boş her ikisi de autosize true .. Aşağıdaki rutin a açısı ile resmidöndürüyor ancak daha önce sözünü ettiğim sorunlar var. Basit olduğu için sorunları giderirsin heralde


var
o, b : TBitmap;
a : Double;
xn,yn,xo,yo,dy: Integer;
begin
b:=TBitmap.Create;
Try
a:=pi/8;
o:=im.Picture.Bitmap;
b.Width:=Round(Cos(a)*o.Width+Sin(a)*o.Height);
b.Height:=Round(Sin(a)*o.Width+cos(a)*o.Height);
dy:=Round(Sin(a)*o.Height);
for xo:=0 to o.Width-1 do for yo:=0 to o.Height-1 do begin
xn:=Round(Sin(a)*yo+cos(a)*xo);
yn:=Round(-sin(a)*xo+cos(a)*yo)+dy;
if (xn>=0) and (xn<b.Width) and (yn>=0) and (yn<b.Height)
Then b.Canvas.Pixels[xn,yn]:=o.canvas.Pixels[xo,yo];
end;
imnew.picture.Assign(b);
Finally
b.Free;
End;