1 bitlik bmp resmi Rotate yapmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

1 bitlik bmp resmi Rotate yapmak

Mesaj gönderen nosedive »

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.
Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

vay bee :)

Mesaj gönderen nosedive »

ne başlık açarmışım yaavv kimsenin bi fikri yok :) kimse ilgilenmiyormu bu konu ile :)
Kullanıcı avatarı
mepc
Üye
Mesajlar: 191
Kayıt: 26 Eyl 2003 11:39
Konum: Ankara

Mesaj gönderen mepc »

24 bit çevirme ile ilgili fon. gönderirsen belki fikir verebiliriz.
Bilgi paylaşıldıkça güzeldir.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

1 bit

Mesaj gönderen nosedive »

JimHargis_RotateBitmap.ZIP

bunun bütün formatlarda işlem yapacağını yazıyor ama çözemedim çok karışık geldi...
Kullanıcı avatarı
Master_Yoda
Üye
Mesajlar: 35
Kayıt: 13 Ara 2005 12:57

Mesaj gönderen Master_Yoda »

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
Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

Mesaj gönderen nosedive »

İlginiz için teşekkürler..

Verdiğiniz bilgiler dogru saolun.. ama sorun işte o FX ve FY fonksiyonlarında değilmi...eger boyle bir çalışma yaptıysanız daha once yardımcı olabilirseniz sevinirim..

Teşk
Kullanıcı avatarı
Master_Yoda
Üye
Mesajlar: 35
Kayıt: 13 Ara 2005 12:57

Mesaj gönderen Master_Yoda »

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;
Cevapla