Image Saklama
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Image Saklama
Arakdaşlar kolay gelsin;
bir image içinde bulunan resmi databasede normal bileşenler çerçevesinde saklamak değil de o resme ait veriyi okuyup text olarak saklamak ve ihtiyaç olduğunda tekrar saklanan veriyi image nesnesine yansıtmak istiyorum böyle bir düşüncem var ama nasıl yapabileceğim konusunda fikri olan veya daha önceden böyle bir şey yapan varsa lütfen yardım etsin ayrıca bu mantıklı olurmu yani böyle birşey yapsak bile database de text in tutacağı yer image in tutacağı yerden daha az olurmu acaba
bir image içinde bulunan resmi databasede normal bileşenler çerçevesinde saklamak değil de o resme ait veriyi okuyup text olarak saklamak ve ihtiyaç olduğunda tekrar saklanan veriyi image nesnesine yansıtmak istiyorum böyle bir düşüncem var ama nasıl yapabileceğim konusunda fikri olan veya daha önceden böyle bir şey yapan varsa lütfen yardım etsin ayrıca bu mantıklı olurmu yani böyle birşey yapsak bile database de text in tutacağı yer image in tutacağı yerden daha az olurmu acaba
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Sanırım resimlerin üzerindeki bulunan yazıları text haline getirmeyi düşünüyorsunuz. Buna OCR deniyor. En iyi OCR programı Abby Fine Reader. Böyle bir programı oturup yazmanız yıllarınızı alır. Bu programın api'leride var. Bu API'leri kullanarak istediğiniz şeyi kolayca yapabilirsiniz. Eminimki yeni bir hdd bu programın lisans ücretinde ucuz olacaktır. Tabiki resimler üzerinde arama yapamazsınız buda bir dev ajantaj.
- kadirkurtoglu
- Üye
- Mesajlar: 748
- Kayıt: 22 May 2005 01:20
- Konum: Uzakta Görünen Tepeden...
Selam,
Resim text olarak saklamak akıllıca değil. Sıkıştırılmamış BMP dosyalarından örnek vereyim, çünkü onlarda olayı kafanda canlandırman daha kolay olur.
Resimdeki pixeller RGB renk kodları ile ifade edilir. BMP resimlerinde R, G ve B değerleri sadece byte olarabilir, bu da bir pixel için minimum 3 byte demektir. Bilgisayarlar integeri sevdiklerinden ve aynı zamanda BMP formatının ileri sürümlerinde yarı şeffaf resimlere izin verebilmek için bir pixel ARGB değerleri ile ifade edilir. Buradaki A değeri Alpha anlamına gelir ve o da bytetır.
Şimdi toplamda 4 sayıyı aslında bir integer olarak gösterdik. Bu rengin beyaz olduğunu düşünürsek değerler aşağıdaki gibi olacaktır.
Dikkat edersen binary ifadeyi text olarak ifade etmek istediğimizde, bir byte için 3 * 4 = 12 byte kullandık. Yani resmin tuttuğu yeri 4 kat arttırdık.
Senin istediğin özellik RAW formatında var, ama o da çok özel durumlarda kullanılıyor.
Tavsiyem resmi binary olarak blob fielde kaydetmendir.
Kolay gelsin,
Bahadır Alkaç
Resim text olarak saklamak akıllıca değil. Sıkıştırılmamış BMP dosyalarından örnek vereyim, çünkü onlarda olayı kafanda canlandırman daha kolay olur.
Resimdeki pixeller RGB renk kodları ile ifade edilir. BMP resimlerinde R, G ve B değerleri sadece byte olarabilir, bu da bir pixel için minimum 3 byte demektir. Bilgisayarlar integeri sevdiklerinden ve aynı zamanda BMP formatının ileri sürümlerinde yarı şeffaf resimlere izin verebilmek için bir pixel ARGB değerleri ile ifade edilir. Buradaki A değeri Alpha anlamına gelir ve o da bytetır.
Şimdi toplamda 4 sayıyı aslında bir integer olarak gösterdik. Bu rengin beyaz olduğunu düşünürsek değerler aşağıdaki gibi olacaktır.
Kod: Tümünü seç
A - R - G - B
255-255 255 255
Senin istediğin özellik RAW formatında var, ama o da çok özel durumlarda kullanılıyor.
Tavsiyem resmi binary olarak blob fielde kaydetmendir.
Kolay gelsin,
Bahadır Alkaç
Kadirkurtoğlu arkadaşım doğru söylüyor OCR dan bahsetmiyorum. saçma oluşuna gelince herkes özgürdür düşündüğünde ama saçma olmadığını düşünüyorum tabi üstadlar daha iyi bilir işi ancak şçyle bir durum var mesela örneğin delphide bir image ekledğinizde delphi image nesnesideki veriyi aşağıdaki şekilde saklar
Picture.Data = {
055449636F6E0000010001002020000001002000A810000016000000280000000000000010020000000000080100000000000000000000000000000 000000000000000000000000A58271059A7160598F64549191695596956C5A674816F0EA37F6E010000000000000000AD512A01BB673D01BF744907B5653C5DA4573193A5583094B6693E5FBF7D500800000000000000000000000000000000 00000000A37E6D0D946856668F67539}
bende diyorumki ben bu veriyi saklasam yani bu texti. sonuçta resmin kendisi kadar yer kaplamayacağını düşünüyorum sonrada bu veriyi yine image yansıtsam diye düşünüyrum ve doğrusu bunu nasıl yapacağımı bilmiyorum eğer şimdide olmaz fayda sağlamaz gerek yok derseniz bende vazgeçerim ama en azından bunu nasıl yapılacağına dair bir fikir verirseniz yinede sevinirim birşey daha öğrenmiş olurum en azından yapmasamda
tşekkürler
Picture.Data = {
055449636F6E0000010001002020000001002000A810000016000000280000000000000010020000000000080100000000000000000000000000000 000000000000000000000000A58271059A7160598F64549191695596956C5A674816F0EA37F6E010000000000000000AD512A01BB673D01BF744907B5653C5DA4573193A5583094B6693E5FBF7D500800000000000000000000000000000000 00000000A37E6D0D946856668F67539}
bende diyorumki ben bu veriyi saklasam yani bu texti. sonuçta resmin kendisi kadar yer kaplamayacağını düşünüyorum sonrada bu veriyi yine image yansıtsam diye düşünüyrum ve doğrusu bunu nasıl yapacağımı bilmiyorum eğer şimdide olmaz fayda sağlamaz gerek yok derseniz bende vazgeçerim ama en azından bunu nasıl yapılacağına dair bir fikir verirseniz yinede sevinirim birşey daha öğrenmiş olurum en azından yapmasamda
tşekkürler
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Selam,
Daha önce yazdığımı mesajı dikkatli okuyacak olursanız eğer, resmi text olarak saklamanın veri boyutu açısından çok ciddi bir ek maliyet getirdiğiniz göreceksiniz.
Mesajda özel durumlardan bahsettim. Delphi'nin resimleri bu şekilde saklaması özel bir durumdur. Bu hem Delphi'nin proje dosyalarını text tabanlı yapmasından, hem de program kaynaklarının (resource dosyalarından bahsediyorum) script temelli olmasından. Resource dosyalarının script ya da text tabanlı olması da resource dosyalarının özelleştirilmesini inanılmaz derecede kolaylaştırmakta ve aynı zamanda standartlaştırmaktadır.
Bütün bunlara rağmen hala bu şekilde saklamayı istiyorsanız, size yol göstermesi açısından bir iki bilgi daha vereyim.
Resim verisi tek boyutlu bir dizi olarak tutulur, iki boyutlu değil. Bu sanırım işin en önemli noktası. Resmin renk derinliğine göre de yapısı değişir, örneğin 8 bitlik bir resim, her pixel için bir byte ayırır ve bu değer, daha önceden tanımlanmış 256 renklik bir palette index numarasıdır. Eğer resim 24 bit tanımlanmış ise her pixel için 3 byte ayrılır ve her byte Red, Green, Blue değerlerini gösterir. Bunların sıralaması resim formatına göre değişiklik gösterir. Genelde 24 bit resimler için 3 byte değil, 4 byte ayrılır. Bunun sebebi de renk tablosunu olduğu gibi ekran kartının ramlerine yaabilmektir. 32 Bit resimlerde RGB değerlerine ek olarak A (Alpha) değeri vardır. Bu değer 0-255 arası bir değer alır ve 0 o noktanın hiç görünmeyeceğini, 255 tam görüneceğini, ara değerler de orantılı bir biçimde transparent olacağını gösterir.
Delphi'de JPEG resimlerin renk tablosuna direkt erişemezsin, çünkü JPEGlerin renk tablosu encode edilmiştir. TBitmap sınıfındaki resimlerde ise iki yöntem var.
1. Canvas yöntemi: X ve Y değerlerini veriyorsun, sana TColor cinsinden pixel bilgisini gönderiyor. Sakın kullanmayın, inanılmaz yavaş
2. Scanline yöntemi: Renk tablosunda, istediğiniz satırın ile pixelinin adresini verir. Böylece indexli bir biçinmde o satırdaki bütün renklere erişebilirsiniz. Kodlaması daha zordur, ama Canvas'a göre yaklaşık 40-50 kat daha hızlıdır.
Kolay gelsin,
Bahadır Alkaç
Daha önce yazdığımı mesajı dikkatli okuyacak olursanız eğer, resmi text olarak saklamanın veri boyutu açısından çok ciddi bir ek maliyet getirdiğiniz göreceksiniz.
Mesajda özel durumlardan bahsettim. Delphi'nin resimleri bu şekilde saklaması özel bir durumdur. Bu hem Delphi'nin proje dosyalarını text tabanlı yapmasından, hem de program kaynaklarının (resource dosyalarından bahsediyorum) script temelli olmasından. Resource dosyalarının script ya da text tabanlı olması da resource dosyalarının özelleştirilmesini inanılmaz derecede kolaylaştırmakta ve aynı zamanda standartlaştırmaktadır.
Bütün bunlara rağmen hala bu şekilde saklamayı istiyorsanız, size yol göstermesi açısından bir iki bilgi daha vereyim.
Resim verisi tek boyutlu bir dizi olarak tutulur, iki boyutlu değil. Bu sanırım işin en önemli noktası. Resmin renk derinliğine göre de yapısı değişir, örneğin 8 bitlik bir resim, her pixel için bir byte ayırır ve bu değer, daha önceden tanımlanmış 256 renklik bir palette index numarasıdır. Eğer resim 24 bit tanımlanmış ise her pixel için 3 byte ayrılır ve her byte Red, Green, Blue değerlerini gösterir. Bunların sıralaması resim formatına göre değişiklik gösterir. Genelde 24 bit resimler için 3 byte değil, 4 byte ayrılır. Bunun sebebi de renk tablosunu olduğu gibi ekran kartının ramlerine yaabilmektir. 32 Bit resimlerde RGB değerlerine ek olarak A (Alpha) değeri vardır. Bu değer 0-255 arası bir değer alır ve 0 o noktanın hiç görünmeyeceğini, 255 tam görüneceğini, ara değerler de orantılı bir biçimde transparent olacağını gösterir.
Delphi'de JPEG resimlerin renk tablosuna direkt erişemezsin, çünkü JPEGlerin renk tablosu encode edilmiştir. TBitmap sınıfındaki resimlerde ise iki yöntem var.
1. Canvas yöntemi: X ve Y değerlerini veriyorsun, sana TColor cinsinden pixel bilgisini gönderiyor. Sakın kullanmayın, inanılmaz yavaş
2. Scanline yöntemi: Renk tablosunda, istediğiniz satırın ile pixelinin adresini verir. Böylece indexli bir biçinmde o satırdaki bütün renklere erişebilirsiniz. Kodlaması daha zordur, ama Canvas'a göre yaklaşık 40-50 kat daha hızlıdır.
Kolay gelsin,
Bahadır Alkaç
Bu Konuyla ilgili bende araştırma yapıyorum..yukarıdaki text 100-150 KB 'lik bir resime denk geliyor 1 KB yapıyor,(100 Resim 100 KB Yapar)Picture.Data = {
055449636F6E0000010001002020000001002000A810000016000000280000000000000010020000000000080100000000000000000000000000000 000000000000000000000000A58271059A7160598F64549191695596956C5A674816F0EA37F6E010000000000000000AD512A01BB673D01BF744907B5653C5DA4573193A5583094B6693E5FBF7D500800000000000000000000000000000000 00000000A37E6D0D946856668F67539}
Bir firma benden 15.000,20.000 Resimlik proğram istedi ama Direk Bilgisayarda değil ,Tamamen Veritabanında saklanmasını istedi,malum,Firmalar arası patent olayı var,resimlerini.kontrol altına almak istiyorlar..jpeg olarak denedim 1000 resim kaydettim 80 MB Yaptı ve tabiki resim sayısı arttıkca tablo ağırlaşacak..Arkadaşımın düşündüğü gibi Text olarak kaydedip, resim olarak okunursa milyonlarca resim kaydedilir.
Evet arkadaşlar delphi image bilgisini şu şekilde saklar ya bana burdan bu data bilgisini nasıl alır ve tekrar nasıl yazarız söyleyebilirseniz yeter bu iş olur zaten
object Image1: TImage
Left = 144
Top = 56
Width = 105
Height = 105
Picture.Data = {
0954474946496D61676547494638376176003800B3FF00FFFFFFFCFCFCF8F8F8
F2F2F2EBEBEBE2E2E2D7D7D7CBCBCBC1C1C1BBBBBBB8B8B8AEAEAE9999997D7D
7D5050500202022C00000000760038000004FF10C849ABBD38EBCDBBFF60288E
99C61CC68907889AF4A4284DA94A2720514278F4A320C58148671AAC8D066216
2F8D4A4CE540D339ACF4A7400DAA504BA00734BC74A73DF501498F905089AE80
A22FC8290D760A8DA15AF5A74F85EA13A4CAD5A95235A22928A24305E1D28BBC
3402003B}
end
object Image1: TImage
Left = 144
Top = 56
Width = 105
Height = 105
Picture.Data = {
0954474946496D61676547494638376176003800B3FF00FFFFFFFCFCFCF8F8F8
F2F2F2EBEBEBE2E2E2D7D7D7CBCBCBC1C1C1BBBBBBB8B8B8AEAEAE9999997D7D
7D5050500202022C00000000760038000004FF10C849ABBD38EBCDBBFF60288E
99C61CC68907889AF4A4284DA94A2720514278F4A320C58148671AAC8D066216
2F8D4A4CE540D339ACF4A7400DAA504BA00734BC74A73DF501498F905089AE80
A22FC8290D760A8DA15AF5A74F85EA13A4CAD5A95235A22928A24305E1D28BBC
3402003B}
end
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Selam,
Arkadaşlar çok büyük bir yanlış yapıyorsunuz. Resmi text olarak saklamak sandığınız gibi boyutu küçültmez, aksine büyütür. Belki bir iki resimde küçültüyor gibi görünebilir, ama mümkünse testlerinizi 24 bit resimlerle yapın o zaman ne demek istediğimi daha iyi anlayacaksınız. Bakın size hızlıca yaptığım bir testin sonuçlarınız yazayım.
Yeni bir proje açtım ve içine bir tane TImage bileşeni koydum. Bileşenin boyutnunu 237 * 205 'e ayarladım ve projeyi kaydettim. dfm dosyasının boyutu 417 byte tuttu.
Daha sonra TImage içine 100 * 100 boyutunda 24 bit resim ekledim ve başka hiçbir değişiklik yapmadım. Projeyi tekrar kaydettim ve bu sefer dfm dosyası 68.092 byte tuttu.
100 * 100'lük bmp dosyamın boyutu ise yalnızca 30.054 byte. Dikkat ederseniz boyut 2 katından fazla arttı. Üstelik seçilen renklere göre bu biraz daha fazla bile olabilir.
Eğer testlerinizi renk sayısı düşük ve RLE encoded bmp dosyaları ya da jpeg dosyaları ile yaparsanız da yanılırsınız.
Eğer illa text olarak saklayacağım diyorsanız, o zaman daha önce de yazdığım gibi bmp dosyaları için Canvas veya Scanline kullanarak resmin renk tablosuna erişebilirsiniz. Bundan sonra yapmanız gereken tek şey oradaki sayıyı hex stringine çevirip yazmak.
Kolay gelsin,
Bahadır Alkaç
Arkadaşlar çok büyük bir yanlış yapıyorsunuz. Resmi text olarak saklamak sandığınız gibi boyutu küçültmez, aksine büyütür. Belki bir iki resimde küçültüyor gibi görünebilir, ama mümkünse testlerinizi 24 bit resimlerle yapın o zaman ne demek istediğimi daha iyi anlayacaksınız. Bakın size hızlıca yaptığım bir testin sonuçlarınız yazayım.
Yeni bir proje açtım ve içine bir tane TImage bileşeni koydum. Bileşenin boyutnunu 237 * 205 'e ayarladım ve projeyi kaydettim. dfm dosyasının boyutu 417 byte tuttu.
Daha sonra TImage içine 100 * 100 boyutunda 24 bit resim ekledim ve başka hiçbir değişiklik yapmadım. Projeyi tekrar kaydettim ve bu sefer dfm dosyası 68.092 byte tuttu.
100 * 100'lük bmp dosyamın boyutu ise yalnızca 30.054 byte. Dikkat ederseniz boyut 2 katından fazla arttı. Üstelik seçilen renklere göre bu biraz daha fazla bile olabilir.
Eğer testlerinizi renk sayısı düşük ve RLE encoded bmp dosyaları ya da jpeg dosyaları ile yaparsanız da yanılırsınız.
Eğer illa text olarak saklayacağım diyorsanız, o zaman daha önce de yazdığım gibi bmp dosyaları için Canvas veya Scanline kullanarak resmin renk tablosuna erişebilirsiniz. Bundan sonra yapmanız gereken tek şey oradaki sayıyı hex stringine çevirip yazmak.
Kolay gelsin,
Bahadır Alkaç
güleyimmi ağlayayımmı bilemiyorumEvet arkadaşlar delphi image bilgisini şu şekilde saklar ya bana
burdan bu data bilgisini nasıl alır ve tekrar nasıl yazarız söyleyebilirseniz
yeter bu iş olur zaten
bir veri okuyup text - ! - olarak kaydedince niçin küçülsün ?
Opt2000 gerekli cevabı vermiş ama şu kadarını söyleyim ekranda bir resim
göstermek için eğer piksel renk derinlikleri sabitse eni boyu vede renklerin
tutulduğu bir dizi atıyorum 256 renk bir 16x16 bir resim için 256= 1 byte
En = 16
Boy = 16
Renk dizisi [16*16*1]={.....}
eğer 16 renk kullanırsak bu 0.5 byte eder
Renk dizisi [16*16*0.5]={.....} olur
peki arkadaşlar sağolun ilgilerinize.
bir sorum olacak firebird kullanıyorum yaptığım programda büyüklüğü yaklaşık 500 ile 1000 k arasında değişen desenler saklanacak ve hergün yaklaşık 50 adet kayıt girilecek ayda ortalam 1500 yıl itibari ile 550 bin kayıtı bulacak problem yaşarmıyım eğer yaşarsam sizce bu desenleri saklama şekli ne olabile dosya olarak saklamak haricinde
bir sorum olacak firebird kullanıyorum yaptığım programda büyüklüğü yaklaşık 500 ile 1000 k arasında değişen desenler saklanacak ve hergün yaklaşık 50 adet kayıt girilecek ayda ortalam 1500 yıl itibari ile 550 bin kayıtı bulacak problem yaşarmıyım eğer yaşarsam sizce bu desenleri saklama şekli ne olabile dosya olarak saklamak haricinde
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Doğrusu gruplandırıp belli dizinler altında dosya olarak saklamaktır. Burada da önemli bir dizinde çok fazla sayıda dosya varsa bu erişim süresini artırmaktadır. Veritabanına gömünce de binlerce görüntü dosyası için benzer sorunları göze almalısınız.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!