resim üzerinde fare ile seçim alanı oluşturmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

resim üzerinde fare ile seçim alanı oluşturmak

Mesaj gönderen tuanna »

resim üzerinde fare ile seçim alanı oluşturmak sorun bu
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
resmin (imagenin) onclick olayında tıkladığın yerleri değişlene (tercihan TPoint tipinde) atacaksın. sonra yapmak istediğin işlemleri bu kordinatlar göre yapacaksın.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

resim üzerinde alan seçtirme

Mesaj gönderen Opt2000 »

selam,
bu işlemi iki yöntemle yapabilirsin
1. Orjinal resmi değiştirerek
2. Orjinal resmin üzerine başka bir component yerleştirerek.

1. Resmi gösterdiğin bileşenin OnMouseDown ve OnMouseMove eventlerindeki X ve Y koordinatlarını kullanarak, resmin canvasına dikdörtgen çizdirme. Burada Canvas.Brush.Style:=bsClear olursa için boş bir dörtgen çizer. Benzer şekilde Canvas.Brush.Pen.Style:=psDot yaparsan da kesikli çizgiler şeklinde gösterir ki bu da masklamış havası verir. Gerçek bir selection gibi görünür. Ama yeni bir selection yapacağın zaman resmin orjinalini tekrar açmalısın. En hızlı yolu da orjinal resmin bir yedeğinin bellekte tutulması ve gerektiğinde componente assign edilmesi. Bu yöntem, eğer Layer destekli bir resim gösterme bileşeni kullanıyorsan (böyle bir bileşen var mı bilmiyorum ama ben dha önce Builder'da hazırlamıştım) daha mantıklı. Bütün resimlerin üstüne bir tane kendine ait bir layer açar, bütün transform ve selection işlemlerini buna yaptırırsın.

2. Resim gösteren componentin üstüne, bir tane Shape yerleştir ve brushın style'ını gene bsClear, en style'ı da psDotted yap. Ve Shape'in koordinatlarını MouseDown ve MouseMove ile ayarla. Örnek bir kod aşağıda. Bu kod TImage nesnesinin, bir TScrollBox üzerinde olduğu düşünülerek yazılmıştır.

OnMouseDown
if ( Button=mbLeft) then
begin
Shape1.Left:=X - ScrollBox.HorzScrollBar.Position;
Shape1.Top:=Y - ScrollBox.VertScrollBar.Position;
Shape1.Width:=0;
Shape1.Height:=0;
end;

OnMouseMove
if (ssLeft in Shift) then
begin
Shape1.Width:=EnsureRange(X - Shape1.Left -
ScrollBox.HorzScrollBar.Position,
0,Image1.Width);
Shape1.Height:=EnsureRange(Y - Shape1.Top -
ScrollBox.VertScrollBar.Position,
0,Image1.Height);
end;

Kodu Builder'dan çevirdim şimdi, o yüzden yazım hataları olabilir, ama Builder'da sağlam çalışıyor. Daha önce de Delphi'de benzer kodlar yazdım, onlar da problemsiz çalışıyor.

İlk aklıma gelenler bunlar.

Kolay gelsin,

Bahadır Alkaç
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

EnsureRange bu ne demek
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

EnsureRange

Mesaj gönderen Opt2000 »

Aslında adı üstüne. Girdiğin bir sayının belirli bir aralıkta olmasından emin oluyorsun. Seçim alanı, eğer standart bir grafik uygulaması yapacaksan, resmin kendisinden büyük olamaz. Bu yüzden de seçim alanını 0 ile resmin boyutları arasında sınırlıyorsun. Elbette gönderdiğim kodda bir takım eksiklikler var. Örneğin Shape1 nesnesinin ilk pozisyonu da EnsureRange ile kontrol edilmeli. Ayrıca gönderdiğim kod, sağdan sola veya aşağıdan yukarıya seçim alanı yaptırmayacaktır. Ama bunlar işin kolay kısmı, sadece mutlak değerler almalı ve küçük olan değeri Left ve Top için, büyük olan değerleri de Width ve Height için kullanmak gerekir. Ufak bir ipucu daha. Refresh problemlerinin olmaması için, Handle'sız bileşenlerin DoubleBuffered değerini true yap ve Shape nesnesinin boyutunu da BoundsRect veya ClientRect (sanırım birisi read only hangisi bilmiyorum) ile değiştir. Böylece flicker sorununu da çözmüş olursun.

kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

asıl sorun surada oluyor aslında bu seçim alanıyla aldığım resim...

mesala benim resim...4000 * 3000 boyutun strech true yaparsam resim image resminin içine göre boyutlanıuyor buna göre seçim alanı oluşturusam o zaman söle bir sorun oluyor....ben daha sonra bu alana göre resmi parçaladığımda boyutları yanlış çiziyor...

yani.... image.width ile image1.picture.width aynı değil...doğa olarak...
bende yatayzoom,dikeyzoom diye bir değikene küçülme miktarını aldım ve seçilen alan gerçek alan oluşturmak için bu zoom u kullanıyorum....

bölelikle gerçek değerlere ulaşıyorum...
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
miskin
Üye
Mesajlar: 103
Kayıt: 26 Tem 2005 02:02
Konum: Gavuristan

Mesaj gönderen miskin »

Tuanna ayni soruyu elli yerde soruyorsun.
biraz kurallara uy.
miskin
Ve Tanri, bütün kullarini davul edecek :)
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

aslında doğru söylüyorsun arkadaşım ...doğru söleyeni bildik dostu...
Siz hayal edin...Biz yapalım TuannaSoft...
Cevapla