مقال تقني

جداول البحث اللونية ثلاثية الأبعاد في PDF باستخدام الدوال المجزأة من النوع 0

تعتبر دوال PDF من الزوايا الأقل شهرة في المواصفات. معظم المطورين يصادفونها مرة واحدة كعنصر يحتاجه التظليل المحوري من النوع 2 للتدرج بين لونين، ثم لا ينظرون إليها مجددًا. وهذا أمر مؤسف، لأن آلية الدوال تمثل مقيِّمًا عام الأغراض صغير الحجم يعيد التنسيق استخدامه للتظليلات، دوال النقل، دوال النقطة النصف لونية، تدرجات الفصل اللوني، ومنحنيات نقل القناع المرن (soft-mask). من بين الأنواع الأربعة للدوال، يعتبر النوع 0 هو الأقوى والأقل فهمًا. إنها دالة مجزأة (sampled function): شبكة متعددة الأبعاد من قيم المخرجات التي يقوم القارئ بالاستيفاء بينها. وبما أن الشبكة يمكنها استيعاب أي أرقام تضعها فيها، فإن الدالة من النوع 0 يمكن أن تعبر عن تعيين غير خطي تعسفي، وهو بالضبط شكل جدول البحث اللوني (color lookup table)

يستعرض هذا المقال قاموس النوع 0 كما يحدده معيار ISO 32000-1 في القسم §7.10.2، ثم يعرض الحالتين الأكثر أهمية في خط أنابيب المستندات: جدول بحث لوني (LUT) لتصحيح الألوان RGB إلى RGB بثلاثة مدخلات، وتحويل تدرج لوني موضعي بمدخل واحد. يخدم نفس منشئ الدوال المجزأة كليهما، ويكمن الاختلاف بينهما بالكامل في مسألة عدد المدخلات التي تمتلكها الشبكة

الدالة المجزأة هي شبكة يقوم القارئ باستيفائها

تقوم الدالة من النوع 0 بتعيين متجه m المدخلات إلى متجه n المخرجات عن طريق تخزين العينات على شبكة منتظمة والاستيفاء بينها. يدرج معيار ISO 32000-1 §7.10.2 المفاتيح التي تصف تلك الشبكة. يحتوي /Domain على رقمين لكل مدخل، يمثلان الحدين الأدنى والأعلى لكل محور إدخال. يحتوي /Range على رقمين لكل مكون إخراج. /Size عبارة عن مصفوفة من أعداد m الصحيحة التي تعطي عدد العينات على طول كل محور إدخال، لذا فإن شبكة مكونة من اثنتي عشرة عينة في كل جانب ضمن ثلاثة أبعاد تمتلك /Size [12 12 12] وتخزن 1,728 نقطة شبكية. يحدد /BitsPerSample دقة كل قيمة مخزنة؛ تقبل HotPDF أرقامًا بتية تبلغ 1، 2، 4، 8، 12، 16، 24، و 32 بتًا، لتطابق القيم التي يسمح بها الجدول 38

يُقرأ تيار العينات بترتيب ثابت. يتباين بُعد الإدخال الأول بشكل أسرع، ثم الثاني، وهكذا، وعند كل نقطة شبكية، يتم تخزين مكونات الإخراج n بالترتيب. بالنسبة لجدول RGB إلى RGB يتكون من ثلاثة بايتات لكل نقطة شبكية عند ثمانية بتات، وتكون موزعة كالتالي: مخرجات الأحمر، ومخرجات الأخضر، ومخرجات الأزرق، تُمسح عبر مدخلات الأحمر أولاً. هناك مفتاحان إضافيان يقومان بتعيين العالم المستمر على الشبكة العددية الصحيحة. يقوم /Encode بتعيين كل إدخال من فترته في /Domain إلى نطاق فهرس العينة 0 إلى Size[i] - 1، ويقوم /Decode بتعيين الأعداد الصحيحة الخام المخزنة مرة أخرى إلى فترات /Range. عندما تتركها في إعداداتها الافتراضية، فإن إدخالاً يغطي [0 1] سيقع بسلاسة على الشبكة بالكامل، ويتم فك ترميز بايت مخزن بقيمة 255 إلى أعلى نطاق الإخراج الخاص به، وهو ما يتطلبه جدول البحث اللوني (LUT) المُطبَّع على [0,1]

الرتبة 1 (Order 1) مقابل الرتبة 3 (Order 3)

بين نقاط الشبكة، يضطر القارئ إلى إجراء استيفاء، ويختار مفتاح /Order كيف يتم ذلك. /Order 1 عبارة عن استيفاء خطي متعدد: خطي على طول محور واحد، وثنائي الخطية عبر محورين، وثلاثي الخطية عبر ثلاثة محاور. إنه سريع، وهو بالضبط ما تقوم به الأجهزة في معظم برامج العرض، وبالنسبة لتحويل ألوان سلس، فإنه عادة لا يمكن تمييزه عن أي تقنية أكثر تعقيداً. تطلب /Order 3 الاستيفاء الشريحي التكعيبي (cubic-spline interpolation)، والذي يناسب منحنى أكثر سلاسة عبر العينات على حساب المزيد من العمل ومنطقة دعم أوسع حول كل نقطة يتم تقييمها

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

جدول 3D LUT: ثلاثة مدخلات، ثلاثة مخرجات

يعتبر تصحيح ألوان RGB إلى RGB مثالاً كلاسيكيًا لشبكة ذات ثلاثة مدخلات، جدول 3D LUT الكلاسيكي المستخدم في تدرج الألوان ومطابقة الأجهزة. كل محور من محاور المكعب عبارة عن قناة إدخال واحدة، وكل نقطة شبكية تخزن ثلاثية RGB المصححة لإحداثي الإدخال ذلك، ويقوم القارئ باستيفاء عينات الزوايا خطياً بشكل ثلاثي حول أي لون قادم. إن المدخلات الثلاثة لا مفر منها هنا لأن الأحمر المصحح قد يعتمد على الأخضر والأزرق المدخلين، وليس فقط على الأحمر المدخل؛ فلا يمكن لمنحنى خاص بكل قناة أن يعبر عن التداخل بين القنوات (channel crosstalk)، بينما يستطيع المكعب ذلك

تقوم HotPDF ببناء تيار النوع 0 من خلال RegisterSampledFunction، والذي يأخذ /Domain، و /Range، و /Size، و /BitsPerSample، وبايتات العينات مباشرةً ويُرجع كائن الدالة. بالنسبة لمكعب معياري مُطبَّع، تمرر حدود [0,1] على جميع محاور الإدخال الثلاثة والمخرجات الثلاثة، وبحجم N x N x N، وجدول العينات المسطح. يتحقق المنشئ من مطابقة عدد البايتات للشبكة: بالنسبة للعمق المصطف بالبايت فإنه يتوقع عدد مخرجات (OutputCount) × (BitsPerSample div 8) × جداء الأحجام، ويرفع استثناءً إذا كانت المصفوفة بطول خاطئ، لذا فإن الخطوة غير المحسوبة بشكل صحيح تفشل بصوت عالٍ عند التسجيل بدلاً من التصيير كبيانات مهملة لاحقًا

const
  N = 17;  // 17 x 17 x 17 cube, the common ICC LUT resolution
var
  LutFn: THPDFStreamObject;
  Samples: TBytes;
begin
  // Fill Samples with N*N*N grid points, 3 bytes each (R,G,B output),
  // red input varying fastest. Build the corrected triple for each
  // grid coordinate with your ICC-managed conversion, then store it.
  SetLength(Samples, N * N * N * 3);
  BuildCorrectedCube(Samples, N);   // your color-managed fill

  LutFn := Pdf.RegisterSampledFunction(
    [0,1, 0,1, 0,1],   // /Domain: three input axes on [0,1]
    [0,1, 0,1, 0,1],   // /Range:  three output channels on [0,1]
    [N, N, N],         // /Size:   the cube resolution per axis
    8,                 // /BitsPerSample
    Samples,
    1);                // /Order 1 = trilinear
end;

تكمن الدقة اللونية للمكعب في كيفية تعبئتك له، وليس في دالة PDF. الطريقة الأصدق هي حساب كل نقطة شبكية من خلال تحويل يُدار بـ ICC، وهو نفس المحرك الذي يوجه التدقيق اللوني البرمجي (soft-proof)، بحيث يكون للأرقام الموجودة في الشبكة معنى حقيقي مقابل ملفات تعريف المصدر والوجهة المحددة. قم بتسجيل ملفات التعريف التي تحد التحويل باستخدام RegisterICCProfile، والذي يسجل مساحة لونية تعتمد على ICC (مكون 1 أو 3 أو 4) ويُرجع اسم مورد يمكنك إرفاقه بالمحتوى الذي يغذيه جدول البحث اللوني (LUT). تحمل دالة النوع 0 جدول الاستيفاء؛ بينما يحمل ملف تعريف ICC المعنى وراء النقاط النهائية

الحالة 1D: تحويل تدرج الألوان الموضعية

تعتمد مساحات ألوان الفصل (Separation color spaces) على نفس الآلية للقيام بوظيفة مختلفة تمامًا. تمثل مساحة الفصل (Separation space)، المُعرفة في ISO 32000-1 §8.6.6.4، مُلَوِّناً واحداً، كحبر موضعي مثل بانتون (Pantone) أو الورنيش، من خلال إقران اسم بتحويل تدرج الألوان: دالة تقوم بتعيين قيمة التدرج أحادية البعد، من 0 لعدم وجود حبر إلى 1 للحبر الكامل، على مساحة لونية بديلة يمكن للجهاز تصييرها فعلياً، وعادة ما تكون CMYK. غالبًا ما يكون تحويل تدرج الألوان هذا دالة من النوع 0، والآن تمتلك الشبكة محور إدخال واحد فقط

هذا هو التباين الواضح مع 3D LUT. يمتلك الحبر الموضعي درجة واحدة من الحرية، لذلك يحتاج تحويل تدرجه اللوني إلى مدخل واحد وتكون الشبكة عبارة عن خط من العينات، يحمل كل منها قيمة CMYK (أو قيمة بديلة أخرى) عند مستوى التدرج ذلك. يحتاج مكعب RGB إلى ثلاثة مدخلات لأن مجاله ثلاثي الأبعاد والقنوات تتفاعل فيما بينها. نفس نوع الدالة، نفس قواعد الاستيفاء، أبعاد مختلفة؛ تعيد المواصفة استخدام مقيِّم واحد وتترك /Size يحدد ما إذا كنت تسير على خط، أو مستوى، أو مكعب. تقوم HotPDF بتغليف عملية الفصل بأكملها في RegisterSeparationLUT، والذي يبني تحويل التدرج من النوع 0 ذو الإدخال الواحد من مصفوفة بايتات مسطحة داخلياً ويُرجع اسم مورد المساحة اللونية

var
  SpotCS: AnsiString;
begin
  // Four CMYK output bytes per tint grid point, tint domain [0..1].
  // Here 0% ink -> all zero, 100% ink -> a rich spot build,
  // with two interior steps; the tint transform interpolates between.
  SpotCS := Pdf.RegisterSeparationLUT(
    'PANTONE 286 C',         // colorant name
    'DeviceCMYK',            // alternate color space
    [  0,   0,   0,   0,     // tint 0.00 -> 0,0,0,0
      90,  60,   0,   0,     // tint 0.33
     100,  80,   0,  10,     // tint 0.66
     100,  72,   0,  18]);   // tint 1.00 -> full ink build
  // Use SpotCS with SetFillColorSpace / SetFillColor on a page.
end;

يجب أن يكون عدد العينات عددًا صحيحًا من نقاط الشبكة: مضاعف إيجابي لعدد مكونات المساحة البديلة، ونقطتان على الأقل لكي يكون هناك مقطع للاستيفاء. قم بتمرير ثلاثة بايتات لكل نقطة مقابل مساحة بديلة من نوع CMYK وسيتم رفض الاستدعاء، وهو نفس التحقق الدفاعي الذي يطبقه منشئ 3D، وهذا ما تريده من دالة ستفشل بشكل صامت في وقت الطباعة ما لم يتم ذلك

أين تظهر نفس الآلية مرة أخرى

بمجرد أن ترى النوع 0 كجدول استيفاء عام، تتوقف ميزتان أخريان للتحكم في الأجهزة عن الظهور كحالات خاصة. تقوم دالة النقل (transfer function) بضبط قيم المكونات في طريقها إلى جهاز الإخراج، وهي مجرد دالة لكل قناة؛ تسجلها HotPDF كحالة رسومات ممتدة (ExtGState) من خلال RegisterTransferFunctionState، والتي تقبل إما دالة مجمعة واحدة أو مصفوفة من الدوال الخاصة بكل قناة. لأن هذه الدوال هي كائنات دوال عادية، يمكنك تمرير كائن THPDFStreamObject ذاته الذي يُرجعه RegisterSampledFunction وتوجيه منحنى نقل من جدول مجزأ بدلاً من صيغة حسابية

var
  ToneFn: THPDFStreamObject;
  GsName: AnsiString;
begin
  // A single-input, single-output sampled tone curve on [0,1].
  ToneFn := Pdf.RegisterSampledFunction(
    [0,1], [0,1], [256], 8, ToneCurveBytes, 1);

  // Apply it to all channels as a combined /TR2 transfer function.
  GsName := Pdf.RegisterTransferFunctionState(ToneFn, []);
  // Select GsName on the page before drawing the affected content.
end;

يندرج توليد اللون الأسود (Black generation) وإزالة اللون التحتي (undercolor removal) تحت نفس العائلة. عندما يقوم جهاز ما بتحويل RGB إلى CMYK، فإنه يقرر مقدار المكون الرمادي الذي سيحمله كحبر أسود، وتعبر المواصفة عن هذا القرار كدالة، من خلال الإدخالات /BG2 و /UCR2 في قاموس حالة الرسومات، كل منهما عبارة عن منحنى بمدخل واحد يبدأ من الرمادي المحسوب وينتهي إلى كمية الأسود. هذه الدوال هي أيضًا من النوع 0 عندما ترغب في استخدام منحنى مقاس بدلاً من منحنى تحليلي، ويتم بناؤها بنفس الطريقة من خلال RegisterSampledFunction وتوضع ضمن حالة الرسومات. الدرس الذي يستحق حفظه هو أن دالة PDF ليست المكان الذي تحدث فيه إدارة الألوان؛ بل هي جدول البحث الذي يحمل قرارًا اتخذته باستخدام محرك ألوان حقيقي، والنوع 0 هو نوع الدالة الوحيد المرن بما يكفي لحمل أي قرار مهما كان

للحصول على صورة أشمل حول كيفية إخراج الخطوط، والصور، وموارد الألوان في المستند النهائي، راجع دليلنا التفصيلي لإخراج التقارير باستخدام الخطوط والصور. عندما يتعين على المخرجات اجتياز فحص ما قبل الطباعة (preflight) للأرشفة أو الطباعة، فإن قواعد المساحات اللونية وقصد الإخراج المغطاة في دليل التحقق الخاص بـ PDF/A و PDF/X و PDF/UA هي التي تحكم الدوال المسموح بها وكيفية وضع العلامات على ألوان الجهاز. يتوفر كل ذلك ضمن مكون HotPDF المخصص لدلفي و C++Builder، إلى جانب واجهات برمجة التطبيقات (APIs) الخاصة بالتظليل، و ICC، والفصل اللوني والتي تُبنى على أساس نفس نواة النوع 0