Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Resim kayit etme ve kontrolü
#1
Arkadaslar merhaba,

Bir Projede resim ekletip bunu görüntülüyorum, resimleri kayit ederken resmin ismi ve sonuna tarih ve saat i ekliyorum. Problemim ayni resimi 10 kez de kayit edebiliyor olmam.
Bunun icin bana ne önerebilirsiniz ?
Cevapla
#2
(06-11-2016, Saat: 20:56)Ugur Adlı Kullanıcıdan Alıntı: Arkadaslar merhaba,

Bir Projede resim ekletip bunu görüntülüyorum, resimleri kayit ederken resmin ismi ve sonuna tarih ve saat i ekliyorum. Problemim ayni resimi 10 kez de kayit edebiliyor olmam.
Bunun icin bana ne önerebilirsiniz ?

selam , resimin sonuna neden saat tarih bilgisi ekliyorsunuz? 
zaman bilgisi sürekli değişeceğinden birden fazla eklemesi normal değilmi?
resimi ne için ekliyorsunuz? ürüne özel bir resim midir?
Cevapla
#3
selam, is yerinde Makinalarin durdma sebeini analiz icin bir program yazdik. burada makinalarin bölümü vs vs... bilgileri verip makinalarin neden durduunu veritabanina kayit ediyorum.
Resimler ise ispat amacli makinalarin neden durdugunu screenshot olarak alip bir klasörde tutuyorum. Veritabanina bu resimlerin yolunu kayit ediyorum.
simdi örnek makina1 diye screenshot yaptim bunun sonuna tarih saat olarak kayit edtim. (günde en az 20-50 arasi kayit giriliyor) her seferinde bu resimlere isim bulmayalim diye (örnek bir hafta sonra yine makina1 olarak screenshot ismi verdim) bu isim mevcut baska isim sec demesin diye.

Lakin bu seferde birden fazla ayni resimi kayit edebiliyor olmam (yapacagimdan degilde) ama bunu önlemek icin artik checksum mu olur yada baska bir yöntem mi bilemedim.
Onun icin sizlere bu soruyu sordum.
Cevapla
#4
(07-11-2016, Saat: 03:58)Ugur Adlı Kullanıcıdan Alıntı: selam, is yerinde Makinalarin durdma sebeini analiz icin bir program yazdik. burada makinalarin bölümü vs vs... bilgileri verip makinalarin neden durduunu veritabanina kayit ediyorum.
Resimler ise ispat amacli makinalarin neden durdugunu screenshot olarak alip bir klasörde tutuyorum. Veritabanina bu resimlerin yolunu kayit ediyorum.
simdi örnek makina1 diye screenshot yaptim bunun sonuna tarih saat olarak kayit edtim. (günde en az 20-50 arasi kayit giriliyor) her seferinde bu resimlere isim bulmayalim diye (örnek bir hafta sonra yine makina1 olarak screenshot ismi verdim) bu isim mevcut baska isim sec demesin diye.

Lakin bu seferde birden fazla ayni resimi kayit edebiliyor olmam (yapacagimdan degilde) ama bunu önlemek icin artik checksum mu olur yada baska bir yöntem mi bilemedim.
Onun icin sizlere bu soruyu sordum.

Merhaba,
Dosya isimlerinin Unique olması için bir algoritma oluşturmalısınız. 

Örneğin; M012016110717590000000006.jpg
Kredi kartları, IBAN, IMEI, uçak biletleri vb. numaralarında olduğu gibi her bir rakam blokları ayrı bir anlam ifade eder.

Yukarıda vermiş olduğum örneği açıklayayım;
M: İlk hane. Makina
01:2. ve 3. hane. 0-99 arasında olan Makina Id'leridir.
20161107: 4.-11. haneler. Tarih.
1759: 12.-15. haneler. Saat.
0000000006: Son 10 hane hata kayıt Id.

TEkranGoruntusu adında bir record veya class metod oluşturup, iki adet fonksiyonla bu tipi/class'ı güncelleyebilirsiniz.
Hata kayıt işlemi sırasında iki adet fonksiyonunuz (GetEkranGoruntusuDosyaAdıOlustur, GetEkranGoruntusuDosyaAdıAl) algoritmayı oluşrurabilir/parse edebilir. 
Dolayısıyla kullanımı konusunda ve ekran görüntüsünün oluşturulmadan önce kontrolü konusuna sıkıntı yaşamazsınız.
Cevapla
#5
Hocam öncelikle yorumlariniz ve yardimlariniz icin tessekür ederim. Affiniza siginarak pek cözemedim olayi. Simdi algoritma olusturma olayi tamam. Bu ekran resimlerine otomatik isim vermede tamam. Peki ayni resmi yani ekran ciktisini tekrar bu algoritmadan gecirip yeni isim olusturmayi ne engeliyecek anlamadim.

Aslinda acik kaynak kodlarinda genelde oldugu gibi ya exe yada iso gibi dosyalari checksum hash degerini veriyorlar ki , indiren sahis orjinal mi yoksa kurcalanmis mi diye kontrol edebilsin diye.
Buna benzer bir yöntem yada bir mantik olusturabilsem daha iyi olur diye düsünüyorum.
Cevapla
#6
(07-11-2016, Saat: 10:24)Ugur Adlı Kullanıcıdan Alıntı: Hocam öncelikle yorumlariniz ve yardimlariniz icin tessekür ederim. Affiniza siginarak pek cözemedim olayi. Simdi algoritma olusturma olayi tamam. Bu ekran resimlerine otomatik isim vermede tamam. Peki ayni resmi yani ekran ciktisini tekrar bu algoritmadan gecirip yeni isim olusturmayi ne engeliyecek anlamadim.

Aslinda acik kaynak kodlarinda genelde oldugu gibi ya exe yada iso gibi dosyalari checksum hash degerini veriyorlar ki , indiren sahis orjinal mi yoksa kurcalanmis mi diye kontrol edebilsin diye.
Buna benzer bir yöntem yada bir mantik olusturabilsem daha iyi olur diye düsünüyorum.

Merhaba,
Öncelikle şunu belirteyim ki, milisaniye aralıklarla alacağınız ekran görüntülerinin Hash değerleri de farklı olacaktır. Oluşturduğunuz her dosyanın Exif değerleri farklı olduğu için Hash'ler de farklı olacak ve her defasında aynı dosya yeniden kaydedilecektir. Yani sizin hata kayıt sisteminde eski dosya ile yeni dosya arasındaki Hash karşılaştırmaları aynı sonucu vermeyecektir.

Benim anlattığım sistemde;
Veri tabanında oluşturulmuş bir hata kaydı var. Kontrolü şu şekilde yapabilirsiniz.
Veri tabanındaki HataId, Oluşturulmuş resim listesindeki hataId (0000000006: Son 10 hane hata kayıt Id.) ile aynı mı? (aynı ise yeniden oluşturmaya gerek yok). 

Örneğin;

Select HataId from V_HataliEkranGoruntuleriView 
Where :HataId in (Select HataId from HataMakinaTablosu)

Yukarıdaki SQL cümlesine, fonksiyon sonucunda parse işlemine tabi tuttuğunuz class metodunuzun bir property'sini (örn: TEkranGoruntusu.HataId) parametre olarak gönderin. Böylece gönderdiğiniz Hataid veritabanından kayıt döndürüyorsa, daha önce bu kayıt ile ilgili bir ekran görüntüsü alındığını söyleyebilir ve yeni bir görüntü aldırmazsınız.

Hatta bu kriterlere tarih ve saati de ekleyebilirsiniz.
Cevapla
#7
Merhaba,
Ekran görüntüsü ne tür içeriğe sahip bilmediğimizden ihtimaller dahilinde konuşacağız. Farklı zamanlarda alınan ekran görüntüsü niye aynı oluyor bunu bilemiyoruz.

İki farklı zamanda alınan ekran görüntüsünde ekrandaki tüm veriler aynı ancak pencere konumları biraz farklı veya ekranda açık bir program var. Hatta sağ alt köşe veya programın ekranında eğer varsa tarih saat bilgileri farklı olacağından hash değerleride farklı olacaktır. Yani hash değeri hesaplayarak asla ikiz dosya elde edemeyebikirsiniz.

İki dosya yada resimlerin benzerlik oranını karşılaştıran algoritmalar mevcut. Eğer sadece ekranda bir kaç metün tabanlı veri farkı oluyorsa tüm ekran görüntüleri %90-99 arası bir benzerlik oranına sahip olacak. Bunda da stabil bir sonuç elde edemezsiniz.

Bu kadar veri ile bu çıktı verebiliyorum Smile
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#8
(06-11-2016, Saat: 20:56)Ugur Adlı Kullanıcıdan Alıntı: Arkadaslar merhaba,

Bir Projede resim ekletip bunu görüntülüyorum, resimleri kayit ederken resmin ismi ve sonuna tarih ve saat i ekliyorum. Problemim ayni resimi 10 kez de kayit edebiliyor olmam.
Bunun icin bana ne önerebilirsiniz ?

Merhaba,
Hızlı bir geri dönüş, doğru bir cevap arıyorsanız bence görüntüyü kaydettiğiniz ve DB ye dosya yolunu yazdığınız kod bloğunu burada paylaşın, gözden kaçırdığınız bir şeyler olabilir. Belkide daha pratik bir yol ile geri dönüş alacaksınızdır.

İyi çalışmalar.
Cevapla
#9
Selam,
2 resim arasındaki farkı hash harici alabilmek için resmi hangi formatta kaydettiğiniz önemlidir, ben olsam jpg olarak kaydedip boyutuna bakarım, bmp resimlerde width ve height değerleri aynı olduğu sürece resim boyutu aynı olacaktır. fakat jpg dosyalarda içerik (renkler) önemli olacaktır. @engerex in bahsettiği gibi sağ alt köşedeki saatin değişmesi bile hash olayında farklılık yaratır fakat boyut olarak büyük bir fark oluşturmaz. 2 resmi piksel piksel karşılaştırabilirsiniz. hangi satır ve sutunlarda ne kadar değişiklik var algılatıp buna göre kaydet veya kaydetme diyebilirsiniz.

2 resmi karşılaştırıp kaç pikselinin birbirinden farklı olduğunu bulan kod örneği belki başlangıç için yardımcı olabilir. Net de bulduğum bir fonksiyonu değiştirdim sadece.
function ResimKarsilastir(bmp1,bmp2: TBitmap): Integer;
var
  i,j: Integer;
  ScanLine1,ScanLine2: PByteArray;
  Count: Integer;
begin
result:=0;
  if(bmp1.Height = bmp2.Height) and
            (bmp1.Width = bmp2.Width) and
            (bmp1.PixelFormat = bmp2.PixelFormat)
 then
  begin
    i := Integer(bmp1.PixelFormat);
    if i < 4 then
      i := 4
    else if i = 4 then
      inc(i);
    Count := (i - 3) * bmp1.Width - 1;
    for i:=0 to bmp1.Height-1 do
    begin
      ScanLine1 := bmp1.ScanLine[i];
      ScanLine2 := bmp2.ScanLine[i];
      for j := 0 to Count do
        if ScanLine1[j] <> ScanLine2[j] then
        begin
        inc(result);
        end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:=inttostr(ResimKarsilastir(Image1.Picture.Bitmap,Image2.Picture.Bitmap));
end;

WWW
Cevapla
#10
Jpg formatına biraz dikkat etmeniz gerekmekte. Jpg kayıplı bir sıkıştırma formatı. Eğer resmin herhangi bir pikseline bir değer girdiğinizde komşu pikseller bundan etkilenebilir. Yani gerçekte 1 piksel değişim 5-10 pikselde değişimi doğurabilir.
Karşılaştırmayı kayıplı sıkıştırmaya uğramamış doayalarda yapmak gerekebilir.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Veri Tabanına Kontrollü Kayıt Yaptırma bünyamin68 15 618 08-03-2024, Saat: 00:06
Son Yorum: TuncayDelphi
  dxRichEditControl Resim Kaydı m_ekici 0 206 31-10-2023, Saat: 01:42
Son Yorum: m_ekici
  joystic kontrolu sadikacar60 2 397 13-08-2023, Saat: 20:34
Son Yorum: sadikacar60
  WebBrowser Pdf Kayıt Etme sadoal351 1 552 11-07-2023, Saat: 12:39
Son Yorum: delphiman
  DBGrid de Birden Fazla Kayıt Seçmek. OZCANK 12 3.258 07-07-2023, Saat: 15:31
Son Yorum: emre



Konuyu Okuyanlar: 1 Ziyaretçi