1

Konu: Tabloda resim saklama yöntemleri

Selâmlar,

Ben yine projemle ilgil bir soru sormak istiyorum. Tablomda (hasta.dbf) görüntüleri de bulundurmak istiyorum. Örneğin bir hastanın bir biyopsi ile ilgili 2, bir başka hastanın 5 diğer bir hastanın 7 görüntüsü olabiliyor. Bir başka nokta da aynı hastada resimlerin çözünürlükleri de tutarlı olmayabiliyor. Kimi resim 1024*768, kimi de daha yüksek.
Ben şu yolu seçtim. Ayrı bir tablo yarattım (resimler.dbf). Orada hasta.dbf ile aynı olan protno ya da biopsino field'ı var. Bu tabloda bir de bir memo field oluşturdum. Bu field'da da ilgili resim dosyasının yer bilgisi bulunuyor (Örn. "C:\Hasta\resimler\200701656-01.jpg").
Bundan daha verimli ya da üstün bir yaklaşım olabilir mi?
Önerilerinizi bekliyorum.

Teşekkürler...

2

Re: Tabloda resim saklama yöntemleri

resimler.dbf dosyasına bir blob alan ekleyebilirsin ve bu alana filetostr() ile resim dosyasını aktarıp form üzerinde image nesnesinde gösterebilirsin. ya da container içine dosyanın blob alanını referans alan image nesnesi koyup onu da grid içine koyarak dilediğin kadar resmi dbf dosyasına aktarıp grid içinde
altalta görüntüleyebilirsin.

3

Re: Tabloda resim saklama yöntemleri

Bence kullandigin yontem iyi. Goruntuleri mecbur olmadikca bir tabloda tutma, tutacaksan VFP tablosunda tutma, eger ona da mecbur kalırsan o zaman memo ya da blob'ta tut.

Kaba bir hesapla 1024*768 kaliteli bir biopsi resmi 100Mb uzerinde tutar, jpg ile kalite kaybederek 10Mb'a kadar dusebilir gibi. Bu hesaba gore 200 resime ulasamadan bir VFP tablosunun limitlerine gelirsin. Memoda/blobta nasıl tutuldugunu dusununce orada tutmanın pek de bir esprisi yok.

4

Re: Tabloda resim saklama yöntemleri

Teşekkürler.
Son olarak, resimler.dbf'de resim dosyasının yer bilgisinin 254 karakteri geçmeyeceğini (dosya adı "biyopsi numarası-resim no".jpg, yeri de "C:\Hasta\Resimler") düşünerek memo'yu normal Ch field'a dönüştürdüm.

5

Re: Tabloda resim saklama yöntemleri

iste onu yapma:) OS bildigim kadariyla maximum 267 karakter path'e izin veriyor. 254 bugun cok guvenli gorunebilir ama yarini dusun. Memo alan bence daha uygun. Dosyanin extension dahil full adini tut. Simdi jpg kullaniyorsun, ama birgun gif,tif kullanmak isteyebilirsin. Dosya uzantisi olmazsa dogru goruntu formatini bulmak cok da kolay degil (bulunuyor headerdan ama ugrasmaya degmez).

6

Re: Tabloda resim saklama yöntemleri

MS sql 2005 table ında resim tutulabilirmi,  hasta resimleri ile ilgili sql e internet den bağlanıldığında bende de  "C:\Hasta\resimler\200701656-01.jpg"  gibi bir proplem var. ne önerirsiniz
selamlar mesut

7

Re: Tabloda resim saklama yöntemleri

Biraz sabredersen SQL2008 cikacak. SQL2008'de varbinary(max),image gibi alanlarin diskte saklanacagi belirtilebiliyor ve o alanlar ucretsiz Express versiyonun 4Gb'lik database limitine dahil edilmiyor:)
Bugunden betasini indirip kullanma hakkin var.

2000 veya 2005'te ayri bir tabloda (ve databasede) tutabilirsin. Diskte dosya olarak tutmanin problemi oraya yukleme ve okuma (SQL server'a erisim hakkin var ama server diske yok ise mesela).  Bulk insert hakki ya da SQL-CLR kod gerekecek.

8

Re: Tabloda resim saklama yöntemleri

Çetin hocam;  append general gPic from ("J:\ivf\resimler\1.bmp") link
ile 2005 express deki image alanına resmi ekledim ve browse da değerin üzerine tıkladığımda resmi görüyorum. fakat ;
  thisform.image1.picture=hasta.gPic
  thisform.image1.pictureval=hasta.gPic
gibi kullanarak formda resmi gösteremiyorum

9

Re: Tabloda resim saklama yöntemleri

Ben nerde general field kullan dedim? Birsey mi kacirdim?

10

Re: Tabloda resim saklama yöntemleri

Siz demediniz, Bu kodu,
      http://fox.wikis.com/wc.dll?Wiki~ImageData~VFP
da gördüm. Düşüncem;  resmi gösterebiliyorsam, sql de çok sayıda kayıt açıp veritabanında nekadar yer kapladığını bakacaktım. Yöntem olarak da general field da resim saklamanın ne kadar sağlıklı olduğunu acıkcası bilmiyorum !

11

Re: Tabloda resim saklama yöntemleri

valla ben resimleri veritabanında saklamayı hiç tavsiye etmiyorum dostum,oldum olası general alana ısınamadım gitti.

En büyük sermaye nakit,nakit sermaye vakittir...

12

Re: Tabloda resim saklama yöntemleri

Son derece sagliksiz. Hemen hemen tum forumlarda genera field kullanma diye cevap alirsin. O linkte de 4.maddenin sonuna Alex " never General!" diye eklemis.

Link kullandiginda ek yer kaplamaz cunku dosyanin kendisini degil bir header ve path tutuyor. Dogrudan pathini sen tut.

SQL server'a gonderecek ve orada saklayacaksan komple dosyayi gonder. Aldiginda da image'in pictureVal propertysine koy. Ornek:
Once biraz test icin data yaratalim.

Visual Fox Pro
* Test Data yarat - Create test data

lnHandle = Sqlstringconnect('Driver={SQL Server Native Client};Server=.\SQLExpress;'+;
   'Trusted_Connection=yes')
SQLExec(m.lnHandle,'Create Database ImageDb')
SQLExec(m.lnHandle,'Use ImageDb')
SQLExec(m.lnHandle,'Create Table ImageTable'+;
  ' (pkId uniqueidentifier rowguidcol default NewID(),'+;
  ' fName varchar(20),lName varchar(20),'+;
  ' personPicture image)')
 
SQLPrepare(m.lnHandle, ;
  "insert into ImageTable (fName,lName,personPicture) values (?m.fname,?m.lname,?m.image)")
 
lcImagePath = _samples + 'data\graphics'
For ix=1 To Adir(aFiles, Addbs(m.lcImagePath)+'*.*')
  Image = Createbinary(Filetostr(Addbs(m.lcImagePath)+aFiles[m.ix,1]))
  fname = Proper(Left(aFiles[m.ix,1],4))
  lName = Proper(Substr(aFiles[m.ix,1],5,4))
  SQLExec(m.lnHandle)
Endfor
SQLDisconnect(m.lnHandle)
* Test Data yarat - Create test data

Yarattigimiz datayi geri alip formda gosterelim:

Visual Fox Pro
* Form ile goster - Show on a form

Public oForm
oForm = Createobject('myForm')
oForm.Show
 
Define Class myForm As Form
  DataSession = 2
  Height = 400
  Width = 620
 
  Add Object myGrid As Grid With Height = 400, Width = 400, RecordSource = 'Sample'
  Add Object myImage As Image With Left = 410,Top = 10
 
  Procedure Load
    lnHandle = Sqlstringconnect('Driver={SQL Server Native Client};Server=.\SQLExpress;'+;
          'Trusted_Connection=yes')
    CursorSetProp("MapBinary",.T.,0)
    SQLExec(m.lnHandle,'select * from ImageDb..ImageTable','Sample')
    SQLDisconnect(m.lnHandle)
  Endproc
 
  Procedure myGrid.AfterRowColChange
    Lparameters nColIndex
    If This.RowColChange%2 = 1
      Thisform.myImage.PictureVal = Sample.personPicture
    Endif
  Endproc
 
  Procedure Init
    Thisform.myImage.PictureVal = Sample.personPicture
  Endproc
Enddefine

13

Re: Tabloda resim saklama yöntemleri

Ah, Neyzen iste o konuda bircok forumda savas veriyorum:)
Tamam resimleri database'de saklamayalim ama o zaman nerede saklayacagiz? Disarida saklanan resim (ki resim olmak zorunda degil, word,excel,zip...) path bagimli. O path'e ulasma sansi gerekiyor (read/write) vs. Ulasma sansinin disinda data guvenligi diye herseyi koruyorsun ama onlar guvenlik bariyerinin disinda kaliyor. Databaseim SQL server, Oracle vs ise ve benden cok uzaklardaysa, adama SQL serverin kurulu oldugu yerde bana diske ulasim hakki ver mi diyecegiz? Ya da SQL server'da bulk haklari edinip cok kompleks (bana oyle geliyor) bcp kodu filan mi yazacagiz. Arti SQL2008 (Express dahil) image, varchar/binary(max) gibi alanlarin database'de yer almasina ragmen diskte saklanmasini getiryor (yani isin o kismini o hallediyor, senin icin gene field). Yani uzatmayayim bana gore artik resimleri disarida saklayip pathini tutmanin pek esprisi kalmadi.

Benim eski mesajlarimda pathini tutun vardir... Ama zaman geciyor fikirler degisebiliyor. Simdiki aklim olsa (ve de VFP9:) db'de tutardim. Yalniz tabii performans acisindan delyed memo fetch, ayri bir tabloda tutma vs kaydiyla.

14

Re: Tabloda resim saklama yöntemleri

Çetin hocam,değişmeyen tek şey değişimin kendisidir :-) .Şimdi doğruyu söylemek gerekirse,söylediklerinizde haklısız.Benimde kafam karıştı şimdi :-(

En büyük sermaye nakit,nakit sermaye vakittir...