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
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
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
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