Belirli bir noktaya göre Image zoom

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
Kullanıcı avatarı
muratmutlu
Üye
Mesajlar: 57
Kayıt: 02 Tem 2005 02:44
Konum: Antalya

Belirli bir noktaya göre Image zoom

Mesaj gönderen muratmutlu »

Merhaba,

Benim geliştirmesinde bulunduğum program tabletlerde çalışıyor. Bazı ekranlarında bulunan resimlerinin parmak hareketiyle kontrol edilebilmesi gerekiyor. Yani zoom yapılabilmeli ve gerektiğinde kaydırılabilmeli. Bunu yapabilmek için bir scrollbox ın içine image koyup işlem yapıyorum. Parmakla kaydırma işlemlerinde sorun olmuyor ancak büyütme işlemini yaparken büyütme yapılan nokta kayıyor. Ben ise windowsta açtığınız herhangi bir resmi büyütmekte olduğu gibi hangi noktayı büyütüyorsanız oranın büyümesini istiyorum. Bunu herhangi bir fotorafı açarak test edebilirsiniz. (Telefonlardaki resim büyütme mantığı).

Parmak hareketlerini bir unit sayesinde Delphi 7 de çalıştırabiliyorum. Bana zoom noktasının koordinatını ve zoom oranını veriyor. Orana göre resmin genişliğini ve yüksekliğini değiştiriyorum ama büyütme referansı olan noktadan kayıyor. Yani ben ekranın sağ alt köşesini büyütmek isterken scrollbox ın yeni pozisyonunu ayarlayamadığım için saçma sapan yerlere gidiyor. Bunu nasıl ayarlayabilirim . Umarım karmaşık gelmemiştir.

Geliştirme ortamı: Delphi 7
Örnek büyütme mantığı: http://www.flashandmath.com/howtos/zoom/zoom_click.html (Ctrl tuşuna basılı tutarak resimde bir yere tıklayın)

Bu işlemi nasıl bir formülle yapabilirim ?
Kullanıcı avatarı
muratmutlu
Üye
Mesajlar: 57
Kayıt: 02 Tem 2005 02:44
Konum: Antalya

Re: Belirli bir noktaya göre Image zoom

Mesaj gönderen muratmutlu »

Sorunu bir arkadaşım çözdü. Ben de sizinle paylaşmak istedim.

Yapılması gerekenler:
1- Forma bir tane ScrollBox koyun.
2- ScrollBox ın içine bir tane Image koyun ve align özelliğini alClient yapın.
3- Image ın Autosize özelliğini "True" yapın.
4- Image içine büyük bir resim koyun (ScrollBox ın scrollbar ları çıkması için).

Ardından parmak ile yapılan zoom hareketinden gelen koordinatlara göre aşağıdaki kodu çalıştırabilirsiniz. (Dokunmatik ekrana sahip olmayanlar Image üzerinde OnMouseDown event inde deneyebilirler)

uses Math;

Kod: Tümünü seç

procedure TForm1.ResimZoom(Image: TImage; ScrollBox: TScrollBox; ReferansNoktasi: TPoint; Oran: Double);
var
  Dx,Dy: Integer;
  OranX ,OranY: double;
  Pnt: TPoint;
begin
  if (Image.Width < 400) or (Image.Height < 400) then Exit; // Resmi çok fazla küçültmemek için

  Dx := ReferansNoktasi.X;
  Dy := ReferansNoktasi.Y;

  Pnt.X := 0;
  Pnt.Y := 0;
  Pnt := ScrollBox.ClientToScreen(Pnt);

  Dx := Dx - Pnt.X;
  Dy := Dy - Pnt.Y;

  OranX := (ScrollBox.HorzScrollBar.Position + Dx) / ScrollBox.HorzScrollBar.Range;
  OranY := (ScrollBox.VertScrollBar.Position + Dy) / ScrollBox.VertScrollBar.Range;

  Image.Width := Round(Image.Width * Oran);
  Image.Height := Round(Image.Height * Oran);

  ScrollBox.HorzScrollBar.Position := Ceil((Oranx * ScrollBox.HorzScrollBar.Range)) - Dx ;
  ScrollBox.VertScrollBar.Position := Ceil((Orany * ScrollBox.VertScrollBar.Range)) - Dy ;
end;
Oran parametresine "1.2" yazarsanız %20 oranında büyütür. "0.75" yazarsanız % 25 oranında küçültür.
Cevapla