Teknik Makale

Delphi'de Neredeyse Özdeş Görüntüleri Birleştirerek PDF'leri Küçültme

PDF Library for Delphi, DeduplicateSimilarImages aracılığıyla bir PDF'nin içinde aynı görünen ama bayt bazında özdeş olmayan görüntüleri birleştirebilir. Tam yinelenen giderme, yalnızca sözlükleri ve kodlanmış yükleri eşleşen görüntüleri birleştirir; bu ise görüntülerin gerçekte nasıl göründüğünü, bir algısal hash artı iki piksel hatası eşiği kullanarak karşılaştırır ve her referansı tek bir kanonik nesneye yönlendirir

Bunun karşılığını verdiği dosyalar, kazara büyüyenlerdir. Her sayfanın farklı bir tarayıcı tarafından yeniden kodlanmış aynı logoyu taşıdığı taranmış bir grup. Her biri aynı grafiği biraz farklı bir JPEG kalitesinde gömdüğü kaynaklardan derlenen bir rapor. Küçük resimleri iki araç tarafından yeniden üretilen bir katalog. Her durumda dosya, bir resmin birçok kopyasını içerir ve tam yinelenen giderme bunların hiçbirine dokunamaz

"Yeterince Benzer" Ne Anlama Gelmelidir

İki görüntü birleştirilmeden önce üç eşiğin de karşılanması gerekir ve her biri farklı bir fark türünü yakalar. Algısal hash mesafesi yapısal farkı sınırlar: 64 bitlik bir fark hashi, kod çözülmüş görüntünün 64x64'lük bir örneğinden hesaplanır ve izin verilen Hamming mesafesi 0'dan 7'ye kadar uzanır. Ortalama kanal hatası, yeniden kodlamanın ürettiği genel sapmayı sınırlar. Maksimum tek kanal hatası, küçük bir düzenlemenin ürettiği yerelleşmiş farkı sınırlar

Üçünü de gerektirmek, birleştirmeyi savunulabilir kılan şeydir. Bir köşede bir filigranla farklılaşan bir görüntü, düşük bir ortalama hata ve yüksek bir maksimum hataya sahiptir, bu yüzden maksimum hata kapısı onu reddeder. Yeniden sıkıştırılmış bir görüntü ise her yerde küçük bir hataya sahiptir, bu yüzden geçer. Bu, tam olarak bir boyut optimize edicinin çizmesi gereken ayrımdır

Üç eşik, neredeyse özdeş görüntülerin birleştirmesini kapılar: hash mesafesi, ortalama kanal hatası ve maksimum tek kanal hatası
Üç kapı da kod çözülmüş pikselleri kullanır — bir filigran çifti maksimum hata kapısında elenirken yeniden kodlanmış bir ikiz sorunsuzca geçer
uses
  PDFlibrary;

var
  Lib: TPDFlib;
  Stats: TPDFlibImageSimilarityDedupStats;
  Merged: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('scanned-batch.pdf', '');

    // Hash mesafesi 2, ortalama hata 2, tek kanal hatası 4.
    // Seçenekler bir prova çalıştırması isteyebilir, böylece hiçbir şey değiştirilmez
    Merged := Lib.DeduplicateSimilarImages(2, 2, 4, 0, Stats);
    if Merged < 0 then
      raise Exception.Create('deduplication failed');

    Log(Format('%d scanned, %d merged, %d refs repointed, %d bytes duplicated',
      [Stats.ImagesScanned, Stats.ImagesDeduplicated,
       Stats.ReferencesRepointed, Stats.DuplicatePayloadBytes]));
    Log(Format('worst accepted: hash %d, mean %.2f, channel %d',
      [Stats.MaxAcceptedHashDistance, Stats.MaxAcceptedMeanError,
       Stats.MaxAcceptedChannelError]));
    Lib.SaveToFile('scanned-batch-optimised.pdf');
  finally
    Lib.Free;
  end;
end;

Anlamsal Kimlik Görsel Benzerlikten Önce Gelir

Herhangi bir piksel karşılaştırılmadan önce aday görüntülerin anlamsal olarak uyuşması gerekir. Kitaplık, /Length, /Filter ve /DecodeParms hariç tutulan tam görüntü sözlüğünden kararlı bir imza oluşturur, bu yüzden boyutlar, renk uzayı, bit derinliği, maskeler, /Decode dizisi, enterpolasyon, isteğe bağlı içerik üyeliği ve meta verinin hepsi eşleşmelidir

Bu sıralama, bütün bir yanlış birleştirme sınıfını önler. İki görüntü, 64x64'lük bir örnekte özdeş görünebilir ve sayfada farklı davranabilir: /Interpolate değeri true olan biri ve olmayan diğeri, ölçeklendirildiğinde farklı şekilde yumuşatılır ve isteğe bağlı bir içerik grubuna ait olan biri, o katman gizlendiğinde kaybolur. Bu sınırlar boyunca birleştirmek, daha küçük ve yanlış bir belge üretir

Yalnızca dolaylı Image XObject'ler taranır. Satır içi görüntüler, farklı ekonomiye sahip farklı bir yapıdır ve kod çözülemeyen görüntüler, körü körüne birleştirilmek yerine muhafazakâr bir şekilde atlanır ve sayılır — piksel kanıtı yok, birleştirme yok

Arama Nasıl Ucuz Kalır

Her görüntüyü her diğer görüntüyle karşılaştırmak ikinci derecedendir; bu, binlerce görüntü içeren bir belgede kabul edilemez. Bu yüzden hash, her biri üzerinde sıralanmış bir indeks bulunan sekiz 8 bitlik banda bölünür

Güvercin yuvası ilkesi gerisini halleder: iki hash en fazla 7 bit farklıysa sekiz banttan en az birinde tam olarak eşleşmelidirler. Adayları bant bant aramak bu yüzden, kapsamlı bir ikili tarama olmadan izin verilen her eşleşmeyi bulur ve yayımlanan 7 sınırı tam olarak bu garantinin yalnızca o mesafeye kadar geçerli olması nedeniyle var olur

64 bitlik fark hashi sekiz 8 bitlik banda bölünür ve güvercin yuvası ilkesi, yedi bit ters çevrildikten sonra bile bir bandın hâlâ eşleştiğini garanti eder
Sekiz bant boyunca yedi ters çevrilmiş bit, bir bandı sağlam bırakmalıdır; bu, ikinci dereceden bir taramayı sekiz sıralanmış aramaya dönüştürür

Adaylar ve bant isabetleri, nesne numarasına ve nesle göre belirlenimci şekilde sıralanır ve en düşük nesne numarası kanonik hale gelir. Bu, çıktıyı yeniden üretilebilir kılar: optimize ediciyi aynı girdi üzerinde iki kez çalıştırmak aynı kanonik seçimleri üretir; bu, sonuç karşılaştırıldığında veya imzalandığında önemlidir

Prova Çalıştırmaları ve Dürüst Raporlama

Bu, birleştirilen görüntülerin özdeş olmaması anlamında kayıplı bir optimizasyon olduğundan, mantıklı iş akışı atlamadan önce bakmaktır. Prova çalıştırması seçeneği, nesne grafiğini değiştirmeden neyin birleştirileceğini ve ne kadar yükün geri kazanılacağını raporlar, bu yüzden bir toplu iş etkiyi günlüğe kaydedebilir ve bir insan eşikleri dosya başına değil bir kez onaylayabilir

Raporlamada bahsedilmeye değer iki dürüstlük notu vardır. Geri kazanılabilir rakam, yalnızca yinelenen akışların kodlanmış yükünü tahmin eder; sözlük, dolaylı nesne ve çapraz referans yükünü saymaz, bu yüzden gerçek dosya boyutu azalması, raporlanandan küçük değil biraz daha büyüktür. Ve rapor, kabul edilen maksimum hatayı ve karşılaştırma iş yükünü gösterir, bu yüzden birleştirmelerin eşiklerinize ne kadar yaklaştığını görebilirsiniz

Sabit 64x64 örnekleme ızgarası, kasıtlı bir yaklaşıklıktır ve açıkça belirtmeye değer bir sonucu vardır: bir örnek hücresinden daha küçük bir fark, sıfır eşikte bile gözlemlenmeyebilir. Taranmış bir sayfadaki değiştirilmiş tek bir kelime, bu örneklemeyi atlatamayabilir. Bayt düzeyinde kanıt gerektiğinde bunun yerine tam yinelenen giderme yolunu kullanın — o, yalnızca gerçekten özdeş kaynakları birleştirir ve hiçbir görsel yargıda bulunmaz

Bir Boyut Küçültme Boru Hattında Nereye Ait Olduğu

Geçişleri riske göre sıralayın. Önce tam kaynak yinelenen gidermeyi çalıştırın, çünkü kayıpsız ve bedavadır. Ardından yazı tipi alt kümelemesi, o da kayıpsızdır ve metin ağırlıklı belgelerde genellikle en büyük tek kazançtır; PDF dosya boyutu optimizasyonu ve yazı tipi alt kümeleme başlığında ele alındığı gibi. Ardından hedef ortam izin veriyorsa görüntü yeniden sıkıştırma veya alt örnekleme. Algısal yinelenen giderme bunlardan sonra gelir, çünkü sonucu bir yargı kararına bağlı olan tek adımdır

Kayıpsız tam yinelenen giderme ve yazı tipi alt kümelemeden koşullu görüntü yeniden sıkıştırma, algısal yinelenen giderme ve doğrulamaya kadar önerilen boru hattı sırası
Her adım risk ekler, bu yüzden kayıpsız kazançlar önce gelir ve yargı kararına dayalı birleştirme son çalışır, ardından bir render-ve-karşılaştır kontrolü izler

Eşikleri global olarak değil belge sınıfına göre seçin. Her sayfanın aynı antetli kağıdı taşıdığı taranmış gruplar için, yaklaşık 2 ortalama hataya sahip 2 ila 3'lük bir hash mesafesi, antetli kağıdı güvenilir şekilde birleştirir. Görüntülerin veri taşıdığı belgeler için — grafikler, haritalar, tıbbi görüntüler — sıfır veya sıfıra yakın eşikler kullanın veya geçişi tamamen atlayın, çünkü tek bir çizilmiş noktada farklılaşan iki grafik, 64x64'te ne kadar benzer görünürse görünsün iki farklı grafiktir

Optimize ettikten sonra doğrulayın. Öncesi ve sonrasında bir örnek sayfa kümesini render edin ve karşılaştırın ve sayfa sayısının ve görüntü sayısının beklediğiniz şekilde değiştiğini kontrol edin. Bir belgenin gerçekte ne içerdiğine dair inceleme yolu, kategoriye göre PDF dosya boyutunu denetleme başlığında anlatılmıştır; bu aynı zamanda görüntülerin baştan beri sorununuz olup olmadığını öğrenmenin en hızlı yoludur

Algısal yinelenen giderme, tam kaynak yinelenen giderme ve boyut denetimi, Delphi, C++Builder ve Free Pascal için aynı nesne grafiği üzerinde çalışır; eksiksiz özellik listesi PDF Library for Delphi sayfasında bulunur