resimler...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

resimler...

Mesaj gönderen loxka »

Master-Detail kullanarak dosyalarımı kullanıyorum. dosyano ile resim filedleri ilişkili... Bazen bir dosya no sunda 4-5 tane resim olabiliryor.
Yapmak istediğim resimlerin hepsini bir arada görmek ACDSee deki gibi mesala, yada başka bir yol önereceğiniz birşey varmıdır.
Teşekkürler
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Sorunuzu okudum ama tam anlayamadım. Yapmak istediğiniz şey Delphi üzerinde mi?

Yani ACDSee'ye benzer bir şekilde aynı form üzerinde birkaç değişik resmi göstermekten mi bahsediyorsunuz. Yoksa ACDSee'ye bunları bir parametre olarak geçip orada mı göstermek istiyorsunuz.

Eğer biraz daha açıklayıcı anlatırsanız yardımcı olmaya çalışırız.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

yapmak istediğim tümüyle delphi içinde olmalı. Mesela kişiye ait resimlerin hepsini bir arada görebilmeliyim. (ASDsee örneğini bunun için vermiştirm oradada açınca resimleri bir arada görebiliyorsunuz)
Dediğim gibi benim master detail tablomda resimleryolu dosya no ile ilişkili. Velhasılı dosya nosunu göstererek (yada başka şekilde) o kişi adına yüklenmiş resimleri toplu halde görebilmek istiyorum.
teşekkürler
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Aşağıda anlatacağım mantık, Master'da ana bilgiler, Detail'de ise Resimlerin Path'lerinin durduğu varsayımı iledir.

Ekranı en az iki parçaya bölüp, bir kısmında master detail tabloları göstermelisiniz gerekirse burada edit yapılabilmeli.
Diğer bölümünde ise
TImage nesnesinden, Detaildeki kayıt sayısında türetilmiş nesneler olmalı.

Yani

Detailde dön,
TImage create et,
create ettiğin nesneyi bir arraya at,
Formdaki pozisyonunu ayarla,
boyutunu ayarla,
Stretch'ini true yap,
Detail'den dosyanın Path'ini ve Dosya adını al,
LoadFromFile ile yüklet,
Detailden yeni bir kayıt al taa ki detailde sona ulaşıncaya kadar.

Yalnız bunları forma yerleştiriken, yerleşime dikkat et. Örneğin gösterim boyutu 100*100'lük olsun. Bir tane okudunuz ve create ettiniz ve bunun pozisyonu 0,0'dan 100,100 yerleştirdiniz, diğerini yerleştirirken bunun yanına çıkması için 200,0'dan 300,100 olarak yerleştirmeniz lazım, diğerleri yanına gelecek şekilde bir mantık,
Sağa doğru sayfa bittiğinde bir alt satıra geçmesini sağlamalısınız.

Ayrıca en son olarak TImage nesnesi çift tıklanır ise yeni bir Modal açılan formda seçilen nesnenin bilgileri ile fullscreen (veya size'ı ne ise) o boyutta açılan bir formda resmin asıl boyutu ile görüntülenmesini sağlayabilirsiniz.

Umarım yol gösterici olmuştur ve umarım işinize yarar.

Anlaşılmayan bir şey varsa yada ihtiyaç duyduğunuz başka bir şey varsa yazın.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Teşekkür ederim şu anlattıklarınızı bir uygulamaya çalışayım.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

zor geldi bu iş be...
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Biraz uğraştırır ama yapılmayacak kadar zor değil Kasmaz yani, sadece biraz kod fazlalığı var o kadar :)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Eğer delphide yeniysen ve pratik yapmak istiyorsan Kuri abimin dediklerini yapmanı tavsiye ederim ama vaktim yok daha işim çok diyosan jedi Vcl nin iiçinde jvimagewindow componentini bu işi için kullanabilirsin.

Kolay gelsin
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Kod: Tümünü seç

procedure TForm1.DataSource5DataChange(Sender: TObject; Field: TField);
begin
if FileExists('C:\HKPro\arsiv\'+(Form1.table1DosyaNo.AsString+'_'+Form1.Table5ID.AsString)+'.jpg') then
  begin
    Image1.Visible := True;
    Image1.Picture.LoadFromFile('C:\HKPro\arsiv\'+(Form1.table1DosyaNo.AsString+'_'+Form1.Table5ID.AsString)+'.jpg');
  end else Image1.Visible := False;
end;
Yaparak image nesnesinin içinde görebiliyororum (master-detail) fakat resimleri (porior ve next) tek tek görüyorum. Üzerinde çalışıyorum. Yardımcı olurmusunuz..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...
- Şu an İstanbul'dayım, kod örneği vs. gönderemiycem ama sadece yol yordam adına bir iki önerim olacak...

- @Kuri_TLJ'nin yöntemini denemişsin... Bunu bir adım ileri taşımak şeklinde çözüme ulaşabilirsin... :)

- Master/Detail işlemlerini halletmişsin bu güzel haber... :)

:?: Master Tablonda Referans bilgileri (örnek iller olsun) bulunduğunu ve detail Tablonda da bu iller referansında değişken sayıda image path bilgisi olduğunu varsayalım... Mesela İstanbul 5 adet image, Ankara 10 adet image şeklinde...

:idea: ACDSee'nin Image Browse olayındaki Thumbnail image fonksiyonunu kurmak için, benim önerim her resim için ayrı ayrı TImage değil bir TImage içerisine belirlediğin koordinatlara Canvas.Draw metodu ile kaynak resimleri yapıştıracaksın... Bunların hemen altına da Canvas.TextOut ile de detay bilgilerini yazıp işlemi bitireceksin...

- Şöyle ki... Sol tarafta Referanslarının olduğu bir tablo olduğunu ve sağ tarafta da bir ScrollBox içerisinde resimlerini browse edebileceğin bir panelin olmasını nasıl sağlarsın onu tarif edeyim...

:idea: Bundan önce algoritmik bir önçalışma yapmalısın... Çünkü dinamik çözüm üretmenin dışında algortima programcılığın ABC'sinde A sırasındadır... :wink:

:arrow: Resimlerin başlangıç olarak 100x100 olacak olsun ve her resim arasında 20 Width ve 50 height boşluk koymak istersek, 100x100'lük bir resim aslında 120width, 150 height'lik yer alacak sonucuna varırız...

:arrow: Bu durumda ve/veya kullanıcı ayarlı olmasını istediğin taktirde değişken olacak diğer boyutları düşünüp, scrollbox'u sanal olarak gridlere ayıracak ve hangi koordinat diliminin hangi resme ait olduğunu, daha mouse üzerinde gezinirken bilinmesini sağlayacaksın...

:arrow: Bir resim hangi boyutlarda olursa olsun, bir kenarını 100'e veya kullanıcı tarafından belirlenen boyuta eşitleyip diğer kenarını 0..100 veya kullanıcının belirttşpş boyut arasında oranlı bir şekilde nasıl küçültebileceğini (Canvas.StrechDraw) değerlendiriyorum...

:arrow: Metod basit bir doğru orantı formülüne dayanır... Width/Height oranını bir real değişkene atacaksın, bu değer 1'den büyükse 100 rakamını buna bölecek, 1'e eşit veya küçükse 100 ile çarpacaksın... Bu işlem ile bir kenarı (Width veya Height) 100 olan çerçevenin diğer kenarının 0..100 arasındaki diğer boyutunu verecektir...

:arrow: Browser ekranımıza dönelim... 100x100 düşündüğümüz her resim bloğu için bize lazım olan boyutun 120x150 olduğuna karar kılmıştık...

:arrow: Bir satırda kaç resim olduğunu şu formülle bulucaz...

Kod: Tümünü seç

ScrollBox width değeri / 120 width değeri = sonucunun Trunc() fonksiyonu ile alınacak tamsayı sonuc
:arrow: Bu şekilde kaç satır resim olacağını da Detail tablodakli kayıt sayısını bu satırdaki resim sayısına bölerek bulucaz.. Bölme işlemi küsüratlı çıktıysa en alta bir satır daha ihtiyaç olduğu ve burada bir satıra sığan resim sayısından daha az sayıda ekstra resim olacağını da biliyor olucaz... Bunun için fazladan bir satır daha hesaba katılacaktır...

:arrow: Sıradaki işlem; ScrollBox içerisine yerleştirilen TImage nesnesinin boyutlarını şöyle ayarlamak..

Kod: Tümünü seç

- TImage.Width := Satırdaki resim sayısı * resim başına düşen 120 Width

Kod: Tümünü seç

- TImage.Height := Kaç satır resim olacağı * resim başına düşen 150 height
:arrow: Geriye her resmi bir döngüye sokup, boyutlarını küçültüp ilgili sanal grid'e çizdirmen kalıyor...

:arrow: Bir de 100 height'te resim bittiğini biliyoruz ya (hani oran hesabı yapmıştık) 100 ile 150 arasında bir yere TextOut ile yazı yazdırıp o resmin ne olduğunu kullanıcıya bildirecek başlık...

:idea: Kolay gelsin...

:idea: Bu anlattıklarımı acele acele yazıyorum, sonuçta bir Internet Cafe'deyim ve katim kısıtlı... Yaptığın işlemin başlangıçta basit olmadığını ve çalışmalarını bitirdiğinde aslında ne kadar basitmiş diyeceğini biliyorum... Ben de daha önce böyle bir proje yapmıştım... Metod ise aynı yukarda bahsettiğim gibiydi... Yani çözümü var....

:idea: Dene, yapamazsan arkadaşlarım yardımcı olurla veya Ankara'ya dönünce buradan bir örnek yayınlarım...


- Vakit olursa @admin'imizi de ziyaret edicem... :)
En son mrmarman tarafından 05 Mar 2004 03:16 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

hocam üzerinde çalışıyorum şu an örnek yayınlar iseniz hem benim hemde bilmeyen arkadaşlar için çok iyi olacak. sağolasınız.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

mrmcop yazdı:- Vakit olursa @admin'imizi de ziyaret edicem... :)
buyur gel abi, kapımız her zaman açık :)

Görüşmek üzere.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Özel mesaj ile bildirmene gerek yoktu, bu başlık altında denediğini ama istediğin sonucu elde edemediğini yazsaydın da bana zaten otomatik olarak mail geliyor...

- Bugüne kadar hiç üşenmeden cevap yazdım, vaktim oldukça buna devam da ederim... :roll:

- Özel bir örnek hazırladım... :idea:

- Formuna aşağıdaki nesneleri koy...

Kod: Tümünü seç

TListBox (ListBox1)
TScrollBox (ScrollBox1)
TImage (Image1) // ScrollBox içine koyacaksın...
Button (bt_KucukListe)
- Form Create olayında mı yaparsın, başka şekilde mi bilmem ama ListBox'a BMP dosyalarının dizinleriyle birlikte listesini yaptır... Ben örnek olsun diye FormCreate olayında yaptım...

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000001.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000002.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000003.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000004.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000005.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000006.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000007.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000008.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000009.BMP');
  ListBox1.Items.Add('D:\Delphi\DelphiTurk\Thumbnail Image\IMAGES\00000010.BMP');
end;
- Butona bastığında ScrollBox içinde etrafında mavi çerçeveli ve her resmin altında da o resmin adını textout ile yazılmış olarak göreceksin...

Kod: Tümünü seç

procedure TForm1.bt_KucukListeClick(Sender: TObject);
Const
  SatirArasiBosluk = 50;
  SutunArasiBosluk = 20;
Var
  Blok             : Integer;
  SatiraSigan      : Integer;
  Sayac            : Integer;
  EskiX            : Integer;
  Resim1, Resim2   : TBitmap;

  Oran       : Single;
  YeniWidth  : Integer;
  YeniHeight : Integer;

  SayacSoldanSaga,
  SatirNo          : Integer;
begin
  Blok := 100; // Resim Karesi
  SatiraSigan := ScrollBox1.Width div (Blok + SutunArasiBosluk);

  Image1.Picture.Bitmap := Nil; // Image içini boşalttık...
  // Image1.Width
  Image1.Width  := (Blok + SutunArasiBosluk) *  SatiraSigan;
  // Image1.Height
  If (ListBox1.Items.Count MOD SatiraSigan) > 0
  then Image1.Height := (Blok + SatirArasiBosluk) * ((ListBox1.Items.Count div SatiraSigan)+1) // Artan 1,2,n resim varsa...
  else Image1.Height := (Blok + SatirArasiBosluk) * ((ListBox1.Items.Count div SatiraSigan)  );

  Resim1 := TBitmap.Create; // Okunacak resmimiz...
  Resim2 := TBitmap.Create; // Yeni oluşacak minik resmimiz...
  EskiX  := 0; // Image nesnesi üzerindeki kordinat
  SayacSoldanSaga := 0;
  SatirNo         := 0;
  YeniWidth       := 0;
  YeniHeight      := 0;
  For Sayac := 0 to ListBox1.Items.Count-1 do
  begin //Resimleri sırasıyla okutucaz...
    Application.ProcessMessages;

    Inc(SayacSoldanSaga); // Satırdaki Resim Sayacı
    If SayacSoldanSaga > SatiraSigan then
    begin
      EskiX           := 0;
      SayacSoldanSaga := 1;
      Inc(SatirNo);
    end;

    Resim1.LoadFromFile( ListBox1.Items[Sayac] ); // Büyük resmi okuduk...

    Oran  := (Resim1.Width / Resim1.Height); // Width/Height oranını hesapladık...
    Case Oran >= 1 of // Widht Height büyüklük ilişkisi doğrultusunda
    True : // Width  > Height ise
           begin
             YeniWidth  := Blok;
             YeniHeight := Trunc(Blok / Oran );
           end;
    False: // Height > Width ise
           begin
             YeniHeight := Blok;
             YeniWidth  := Trunc(Blok * Oran );
           end;
    end; // Case

    Resim2.Width  := YeniWidth;
    Resim2.Height := YeniHeight;
    Resim2.Canvas.StretchDraw( Rect(0, 0, Resim2.Width, Resim2.Height), Resim1 ); // Resim1'i küçülterek Resim2'ye çizdik...
    Inc(EskiX, Blok + SutunArasiBosluk);

    Image1.Canvas.Pen.Color := clNavy;
    Image1.Canvas.Rectangle(EskiX - Blok - SutunArasiBosluk, SatirNo* (Blok + SatirArasiBosluk), EskiX, Blok+(SatirNo * (Blok + SatirArasiBosluk)));

    Image1.Canvas.Font.Color := clRed;
    Image1.Canvas.TextOut(EskiX - Blok - SutunArasiBosluk, Blok+(SatirNo * (Blok + SatirArasiBosluk)), ExtractFileName(ListBox1.Items[Sayac]) );

    Image1.Canvas.Draw((SutunArasiBosluk div 2)+EskiX - Blok - SutunArasiBosluk, 5+SatirNo* (Blok + SatirArasiBosluk), Resim2);
  end;
  Resim2.Free;
  Resim1.Free;
end;
- Resimler üzerinde mouse ile hareket ederken de Formun başlığında o resme ait bilgileri göreceksin...

Kod: Tümünü seç

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Const
  SatirArasiBosluk = 50;
  SutunArasiBosluk = 20;
Var
  Blok             : Integer;
  SatiraSigan      : Integer;
begin
  Blok        := 100;
  SatiraSigan := ScrollBox1.Width div (Blok + SutunArasiBosluk);

  If ListBox1.Items.Count >= ((y div (Blok+SatirArasiBosluk))*SatiraSigan+(x div (Blok+SutunArasiBosluk))+1) then
  begin
    Form1.Caption := Format('Resim Adı : %s', [ExtractFileName(ListBox1.Items[((y div (Blok+SatirArasiBosluk))*SatiraSigan)+(x div (Blok+SutunArasiBosluk))])]);
    Form1.Caption := Form1.Caption + ' - ' + Format('%d, %d', [(y div (Blok+SatirArasiBosluk))+1, (x div (Blok+SutunArasiBosluk))+1]);
  end;
end;
:arrow: Hazır kod konusunda ne kadar katı da olsak, DelphiTurkiye forumunda bunun başka örneğini görmediğimden kod göndermeyi uygun gördüm. :idea:

:arrow: Anlaşılır olmasına da çaba gösterdim... Aynı gerekçe ile değişken isimlerini de uzun tuttum... :idea:

:arrow: Geriye afiyet olsun demek kalıyor...
8)
Resim
Resim ....Resim
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Sen varya! süpersin hocam süper..
Allah razı olsun
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Memnun oldum ama önce bir dene... Sonucu tekrar bildir ki, diğer üyeler de kodda olası (evde denedim aslında ama) eksik gedik varsa bilsin... :idea:
Resim
Resim ....Resim
Cevapla