مقال تقني

تصغير ملفات PDF بدمج الصور شبه المتطابقة في Delphi

تستطيع PDF Library for Delphi دمج الصور داخل PDF التي تبدو متطابقة لكنها ليست متطابقة بايتًا، عبر DeduplicateSimilarImages. تدمج إزالة التكرار الدقيقة فقط الصور التي تتطابق قواميسها وحمولاتها المُرمَّزة؛ أما هذه فتقارن كيف تبدو الصور فعليًا، باستخدام تجزئة إدراكية بالإضافة إلى عتبتي خطأ بكسل، وتوجّه كل مرجع إلى كائن قياسي واحد

والملفات التي يُجدي فيها هذا هي التي نمت بالصدفة. دفعة ممسوحة ضوئيًا حيث يحمل كل صفحة الشعار نفسه مُعاد ترميزه بواسطة ماسح ضوئي مختلف. تقرير مُجمَّع من مصادر ضمّن كل منها المخطط نفسه بجودة JPEG مختلفة قليلاً. كتالوج أعادت أداتان توليد صوره المصغَّرة. وفي كل حالة يحتوي الملف نسخًا عديدة من صورة واحدة، ولا تستطيع إزالة التكرار الدقيقة لمس أي منها

ما الذي يجب أن يعنيه "متشابه بما يكفي"

يجب أن تُستوفى ثلاث عتبات جميعها قبل دمج صورتين، ويلتقط كل منها نوعًا مختلفًا من الاختلاف. تُحدِّد مسافة التجزئة الإدراكية الاختلاف البنيوي: تُحسب تجزئة فرق 64 بت من عيّنة 64×64 من الصورة المفكوكة الترميز، وتتراوح مسافة هامينغ المسموح بها من 0 إلى 7. ويُحدِّد متوسط خطأ القناة الانحراف العام، وهو ما تنتجه إعادة الترميز. ويُحدِّد أقصى خطأ لقناة واحدة الاختلاف الموضعي، وهو ما ينتجه تعديل صغير

واشتراط الثلاثة جميعًا هو ما يجعل الدمج قابلاً للدفاع عنه. فصورة تختلف بعلامة مائية في زاوية واحدة لها متوسط خطأ منخفض وأقصى خطأ مرتفع، بحيث ترفضها بوابة أقصى الخطأ. أما صورة أُعيد ضغطها فلها خطأ صغير في كل مكان، بحيث تجتاز. وهذا بالضبط التمييز الذي يحتاج مُحسِّن الحجم رسمه

ثلاث عتبات تحكم دمج الصور شبه المتطابقة: مسافة التجزئة، ومتوسط خطأ القناة، وأقصى خطأ لقناة واحدة
تستخدم البوابات الثلاث جميعها البكسلات المفكوكة الترميز — يموت زوج بعلامة مائية عند بوابة أقصى الخطأ بينما يمر توأم أُعيد ترميزه بسلاسة
uses
  PDFlibrary;

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

    // مسافة تجزئة 2، متوسط خطأ 2، خطأ قناة واحدة 4.
    // يمكن للخيارات طلب تشغيل تجريبي بحيث لا يُعدَّل شيء
    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;

الهوية الدلالية تسبق التشابه البصري

قبل مقارنة أي بكسلات، يجب أن تتفق الصور المرشحة دلاليًا. تبني المكتبة توقيعًا مستقرًا من قاموس الصورة الكامل باستثناء /Length و /Filter و /DecodeParms، بحيث يجب أن تتطابق الأبعاد، وفضاء الألوان، وعمق البت، والأقنعة، ومصفوفة /Decode، والاستيفاء، وعضوية المحتوى الاختياري، والبيانات الوصفية

وهذا الترتيب يمنع فئة كاملة من الدمج الخاطئ. يمكن أن تبدو صورتان متطابقتين في عيّنة 64×64 وتتصرفان بشكل مختلف على الصفحة: صورة بقيمة /Interpolate صحيحة وأخرى بدونها ستُنعَّمان بشكل مختلف عند التحجيم، وصورة تنتمي إلى مجموعة محتوى اختياري ستختفي عندما تُخفى تلك الطبقة. ودمج عبر تلك الحدود ينتج مستندًا أصغر وخاطئًا

وتُفحص فقط كائنات Image XObject غير المباشرة. أما الصور المضمَّنة فبنية مختلفة باقتصاديات مختلفة، والصور التي يتعذر فك ترميزها تُتخطَّى وتُحسب بحذر بدلاً من دمجها على الثقة — لا دليل بكسل، لا دمج

كيف يبقى البحث رخيصًا

مقارنة كل صورة بكل صورة أخرى تربيعية، وهذا غير مقبول على مستند يحتوي آلاف الصور. لذلك تُقسَّم التجزئة إلى ثمانية نطاقات من 8 بت بفهرس مُرتَّب فوق كل منها

ويؤدي مبدأ برج الحمام بقية العمل: إذا اختلفت تجزئتان بما لا يزيد عن 7 بتات، يجب أن تتفقا تمامًا على نطاق واحد على الأقل من النطاقات الثمانية. لذلك فإن البحث عن المرشحين نطاقًا تلو نطاق يجد كل تطابق مسموح دون مسح شامل زوجي، والحد المنشور البالغ 7 موجود بالضبط لأن الضمان لا يصمد إلا حتى تلك المسافة

تنقسم تجزئة الفرق البالغة 64 بت إلى ثمانية نطاقات من 8 بت، ويضمن مبدأ برج الحمام أن نطاقًا واحدًا لا يزال متطابقًا بعد انقلاب سبعة بتات
يجب أن تترك سبعة بتات منقلبة عبر ثمانية نطاقات نطاقًا واحدًا سليمًا، مما يحوّل مسحًا تربيعيًا إلى ثمانية عمليات بحث مرتّبة

وتُرتَّب المرشحات ومطابقات النطاقات بشكل حتمي حسب رقم الكائن والجيل، ويصبح أدنى رقم كائن هو القياسي. وهذا يجعل المخرجات قابلة لإعادة الإنتاج: تشغيل المُحسِّن مرتين على المدخل نفسه ينتج الخيارات القياسية نفسها، وهذا مهم عندما تُقارَن النتيجة أو تُوقَّع

التشغيلات التجريبية والتقارير الصادقة

ولأن هذا تحسين فقداني بمعنى أن الصور المدموجة لم تكن متطابقة، فإن سير العمل المعقول هو النظر قبل القفز. يُبلّغ خيار التشغيل التجريبي عمّا سيُدمج وكم من الحمولة سيُستعاد دون تعديل الرسم البياني للكائنات، بحيث يمكن لمهمة دُفعية تسجيل الأثر ويمكن لإنسان الموافقة على العتبات مرة واحدة بدلاً من لكل ملف

وملاحظتان صادقتان في التقارير تستحقان الذكر. رقم القابل للاستعادة يقدّر حمولة الدفقات المُكرَّرة المُرمَّزة فقط؛ ولا يحسب النفقات العامة للقاموس والكائن غير المباشر والمرجع التقاطعي، بحيث يكون التخفيض الفعلي في حجم الملف أكبر قليلاً مما هو مُبلَّغ عنه لا أصغر. ويعرض التقرير أقصى خطأ مقبول وحمل عمل المقارنة، بحيث يمكنك رؤية مدى قرب الدمج من عتباتك

وشبكة العيّنات الثابتة 64×64 تقريب مقصود، وله نتيجة تستحق ذكرها بوضوح: قد يمر اختلاف أصغر من خلية عيّنة واحدة دون ملاحظة حتى عند عتبة صفرية. فكلمة واحدة تغيّرت في صفحة ممسوحة ضوئيًا قد لا تنجو من تلك العيّنة. وعندما يُطلب دليل على مستوى البايت، استخدم مسار إزالة التكرار الدقيقة بدلاً من ذلك — فهو يدمج فقط الموارد المتطابقة فعليًا ولا يصدر أي حكم بصري إطلاقًا

أين ينتمي في خط أنابيب تقليل الحجم

رتّب التمريرات حسب الخطر. شغّل إزالة التكرار الدقيقة للموارد أولاً، لأنها عديمة الفقدان ومجانية. ثم التجزئة الفرعية للخطوط، وهي أيضًا عديمة الفقدان وعادة أكبر مكسب واحد على المستندات الغنية بالنص، كما هو موضح في تحسين حجم ملف PDF والتجزئة الفرعية للخطوط. ثم إعادة ضغط الصور أو تقليل عيّنتها إذا سمح الوسط الهدف بذلك. وتنتمي إزالة التكرار الإدراكية بعد تلك الخطوات، لأنها الخطوة الوحيدة التي تعتمد نتيجتها على حكم تقديري

ترتيب خط الأنابيب الموصى به من إزالة التكرار الدقيقة عديمة الفقدان وتجزئة الخطوط الفرعية إلى إعادة ضغط الصور الشرطية، وإزالة التكرار الإدراكية، والتحقق
كل خطوة تضيف خطرًا، لذا تأتي المكاسب عديمة الفقدان أولاً ويعمل الدمج القائم على الحكم أخيرًا، متبوعًا بفحص رسم ومقارنة

اختر العتبات حسب فئة المستند لا عالميًا. بالنسبة للدفعات الممسوحة ضوئيًا حيث تحمل كل صفحة الترويسة الرسمية نفسها، تدمج مسافة تجزئة من 2 إلى 3 بمتوسط خطأ حول 2 الترويسة الرسمية بموثوقية. أما بالنسبة للمستندات التي تحمل صورها بيانات — مخططات، خرائط، صور طبية — فاستخدم عتبات صفرية أو قريبة من الصفر، أو تخطَّ التمريرة كليًا، لأن مخططين يختلفان في نقطة مرسومة واحدة هما مخططان مختلفان بصرف النظر عن مدى تشابههما عند 64×64

وبعد التحسين، تحقق. ارسم عيّنة من الصفحات قبل وبعد وقارنها، وتحقق من أن عدد الصفحات وعدد الصور تغيّرا كما توقعت. ومسار الفحص لما يحتويه مستند فعليًا موصوف في تدقيق حجم ملف PDF حسب الفئة، وهو أيضًا أسرع طريقة لمعرفة ما إذا كانت الصور هي مشكلتك أصلاً

تعمل إزالة التكرار الإدراكية وإزالة التكرار الدقيقة للموارد وتدقيق الحجم على الرسم البياني للكائنات نفسه لـ Delphi و C++Builder و Free Pascal؛ وقائمة الميزات الكاملة على صفحة PDF Library لـ Delphi