dbgrid resim görünüyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

dbgrid resim görünüyor

Mesaj gönderen erdogan_ozkaya »

Arkadaşlar,

Aşağıdaki kod ile DBGrid resim alanında resim görünüyor ama sql kaydettiğim alan tipi "IMAGE" olan resimler görünmüyor jpg olarak kaydettim

amacım grind de göstermek yardımcı olan olursa sevinirim.

teşekkürler

Kod: Tümünü seç

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  Bmp: TBitmap;
begin
  if Field is TGraphicField then
  begin
    try
      Bmp:=TBitmap.Create;
      Bmp.Assign(Field);
      DBGrid1.Canvas.StretchDraw(Rect, Bmp);
    finally
      Bmp.Free;
    end
  end
  else
    DBGrid1.DefaultDrawDataCell(Rect,Field,State);
end;

bu kısımda kaydettiğm kod

Kod: Tümünü seç

procedure TARACLAR_PENCERE.btnKAYDETClick(Sender: TObject);
 var
  ARAMA:String;
    AStream: TMemoryStream;
begin
    
    begin
      QRY_ARACLAR.Insert; 
        begin
         if img1.Picture.Graphic = nil
            then   else
            begin
              AStream := TMemoryStream.Create;
              try
                 img1.Picture.Graphic.SaveToStream(AStream);
                 AStream.Position := 0;
           //      if PERSONEL_LISTESI_PENCERE.QRY_RESIMLER_DB.Active then
          //      begin
                  TBlobField(QRY_ARACLAR.fieldByName('ARAC_RESMI')).LoadFromStream(AStream);
      //          end;
                finally
                AStream.Free;
              end;
             end;
             end;
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid resim görünüyor

Mesaj gönderen ertank »

Merhaba,

Kullandığınız Delphi sürümünü belirtmemişsiniz. Aşağıda son kısımdaki bilgiler Delphi 10.1 Update 2 için verilmiştir.

Kaydettiğiniz resim türü BMP olduğunda herşey yolunda çalışıyor olması gerekli. Sadece resim türü BMP dışında olduğunda sorun yaşıyor olmalısınız. Bu normal. Çünkü ekranda göstermek için sadece TBitmap bileşeni kullanıyorsunuz. Kaydettiğiniz resim dosyası jpeg ise TBitmap bileşeni ile bunu ekranda gösteremezsiniz.

Database içine dosya (resim, pdf, vb) saklamak için genellikle iki alan kullanılır. Bir tanesi dosyanın içeriği ki siz bu kısmını yapıyorsunuz. Diğer alan ise metin türünde bir alan olup dosya adı bilgisini veya sadece dosya eki bilgisini içinde saklarsınız. Böyle olduğu zaman kayıtlı dosya içeriği ile ilgili okunacağı zaman bilginiz olur. Sizin de bu şekilde database alt yapınızı ve kayıt rutininizi düzenlemeniz gerekli.

Resim dosyasını database içine kaydeder iken dosya eki bilgisini de ayrı bir kolon içinde saklarsanız, ekranda gösterme kısmında dosya ekine göre uygun resim gösterme bileşeni kullanarak istediğinizi yapmanız mümkün olabilir.

Delphi'de Jpeg, Bmp veya Png. Bunların her birini göstermek için farklı bileşen kullanmanız gerekli. Yani bmp resim türü için TBitmap, Jpeg resim türü için unit Jpeg içindeki TJPEGImage, Png resim türü için unit PngImage içindeki TPngImage bileşenlerini kullanmalısınız.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: dbgrid resim görünüyor

Mesaj gönderen erdogan_ozkaya »

Cevabınız için çok teşekkür ederim uygulama online çalıştığı için veritabanı na kaydetmek zorundayım MSSQL 2012 delphi 7 kullanıyorum resmi göstermek yada kayıtla ilgili bir sorunum yok.

bir sürü kayıt olduğu için geri dönemem tms bileşenlerinde var ama olabilindiğince componenet olmadan yapmak istiyorum grinde jpg olarak veritabanına kayıt ettiğim resmi görmek istiyorum.

resmi veritabanından çekip convert edip gösteremezmiyim ?

teşekkürler
ertank
Kıdemli Üye
Mesajlar: 1653
Kayıt: 12 Eyl 2015 12:45

Re: dbgrid resim görünüyor

Mesaj gönderen ertank »

erdogan_ozkaya yazdı:bir sürü kayıt olduğu için geri dönemem
Aslında geri dönmeniz gerekmiyor. Şöyle düşünün:
- Database tablosuna dosya eki alanını ekleyin. Zorunlu alan olmasın. (NOT NULL kullanmayın)
- Kayıt eden uygulamayı dosya ekini kaydedecek şekle getirin.

Yukarıda yaptıklarınız ile herhangi bir uyumsuzluk sorunu yaşamazsınız. Daha sonra küçük bir uygulama geliştirin. Bu uygulama tamamen eski kayıtların düzeltilmesine yönelik olacak
- Uygulama eski kayıtların tamamını ilk kayıttan son kayda kadar inceleyecek.
- Dosya eki alanı dolu olan kayıtlarda bir değişiklik olmayacak. Bu kayıtları değiştirmeden ilerleyecek.
- Dosya eki alanı boş olan kayıtlar için:
1- Database içindeki kayıtlı dosyayı bitmap olarak okumaya çalışsın. Başarılı olur ise database tablosu dosya eki alanına "bmp" kaydetsin ve sonraki kayda geçsin.
2- ilk yöntem başarısız olur ise bu defa jpeg olarak okumaya çalışsın. Başarılı olur ise dosya eki alanına "jpeg" kaydedip sonraki kayda geçsin.
3- her iki yöntem de başarısız olur ise bu defa png olarak okumaya çalışsın. Başarılı olur ise dosya eki alanına png kaydedip sonraki kayda geçsin.
4- Tüm yöntemler başarısız olur ise database içindeki dosyayı disk üzerinde bir dizin içine tablo eşsiz kayıt numarası ile (primary key alan değeri ile) kaydedip sonraki kayda geçsin.

İşlem tamamlandığı zaman formatı okunamayan resim dosyalarını dışarıdan bir uygulama ile ne formatta olduğunu anlamaya çalışın. Dosya eki güncelleme uygulamasını bu yeni resim türüne göre güncelleyip tekrar çalıştırın.

Bu işlemler sonunda database tablosun içindeki tüm kayıtlarınızda dosya eki alanı dolu olacak. Bu noktaya gelince resim dosyasını ekranda gösterme kodunu güncelleyedek dosya ekine göre ilgili bileşen ile DBGrid içinde gösterebilirsiniz.

Yukarıdakilere alternatif olarak sizin bahsettiğiniz dönüştürme (convert) işlemi ile ilgili;
Öncelikle kayıt kodunuzu güncelleyerek kayıt edilen dosya ne olursa olsun bitmap türüne çevirerek kaydetme yapabilirsiniz. Bununla ilgili şu anda aklıma gelen iki durum karşınıza çıkabilir:
1- Database boyutu ciddi derecede daha büyük olacaktır. Bitmap ortalama olarak jpeg dosyalara göre 10 ile 20 kat daha büyük olacaktır.
Kaynak: http://www.differencebetween.net/techno ... p-and-jpg/
2- Jpeg -> bitmap dönüşümü işlemci süresi kullanacak ve kayıt işlemini yavaşlatacaktır.

Zaten database içinde olan mevcut kayıtların güncellenmesi işlemi için yukarıda bahsettiğim yönteme çok yakın bir yöntem izlemeniz gerekir. Sadece Bitmap olarak okunanlara işlem yapmadan diğer dosya formatlarını okuyarak bu defa bitmap halini kayıt güncellemesi şeklinde database içine kaydetmeniz gerekir. Bu işlem yukarıda önerilen işleme göre database sistemini daha fazla meşgul edecektir. Basit birkaç kelime kaydı ile birkaç MB (bitmap türüne çevirdiğinizde boyutu artacaktır dosyalarınızın) boyutundaki dosyaların database içine kaydedilmesi süre olarak aynı olmaz.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: dbgrid resim görünüyor

Mesaj gönderen greenegitim »

benim bir tablomda (firebird) resim alanım var buraya resmin uzantısı ne olursa olsun wic ile https://en.wikipedia.org/wiki/Windows_Imaging_Component jpg olarak temp bir klasore 150*150 px olacak şekilde kaydediyorum daha sonra orjinal resmi primary alanin degeri ile bir klasöre kaydediyorum.
hem jpg hemde 150*150 yaptığım için boyuta çok küçülüyor yaklaşık 10 bin kayıt olan tablonun büyüklüğü 40 mb kadar.

Resmi gride gösterirken cxgrid kullanıyorum resim column unu propertiesden image ve jpg seçiyorum.
Mücadele güzelleştirir!
Cevapla