resim üzerinde fare ile seçim alanı oluşturmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
resim üzerinde fare ile seçim alanı oluşturmak
resim üzerinde fare ile seçim alanı oluşturmak sorun bu
Siz hayal edin...Biz yapalım TuannaSoft...
resim üzerinde alan seçtirme
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ç
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ç
EnsureRange
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ç
kolay gelsin,
Bahadır Alkaç
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...
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...