ข้ามไปยังเนื้อหา
getnextpdf.com

สี โปรไฟล์ และเหตุใดสีแดงของคุณจึงไม่ใช่สีแดงของฉัน

Spec: ISO 32000-2, §8.6Spec: ISO 15930, PDF/X

สีใน PDF ไม่ใช่ความรู้สึกที่ตายตัว มันคือคำสั่ง และคำสั่งนั้นจะให้สีแดงเดียวกันบนแล็ปท็อป บนโทรศัพท์ และบนแท่นพิมพ์หรือไม่นั้น ขึ้นอยู่กับว่าสีถูกอธิบายไว้อย่างไรทั้งหมด หน้านี้ว่าด้วยความแตกต่างระหว่างสีที่เพียงบอกอุปกรณ์ว่าให้ทำอะไรกับสีที่บอกว่ามันควรมีหน้าตาอย่างไรจริงๆ

เลือกสีแดงของแบรนด์มาสักสี ตั้งค่าครั้งเดียว ทีนี้ลองดูมันบนจอออฟฟิศราคาถูก แล้วดูบนโทรศัพท์ OLED ในห้องที่สว่างจ้า แล้วดูจากงานที่ดึงออกมาจากแท่นพิมพ์ออฟเซ็ต สามสีแดง บางครั้งก็เป็นสามสีแดงที่ต่างกันชัดเจน ไม่มีใครเปลี่ยนตัวเลขนั้นเลย ตัวเลขนั้นไม่เคยเป็นเรื่องราวทั้งหมดตั้งแต่ต้น

สำหรับเอกสารทั่วไปเรื่องนี้ก็แค่ยักไหล่ แต่สำหรับโลโก้ ฉลากที่อยู่ภายใต้ข้อกำกับ ภาพถ่ายในแคตตาล็อก หรือบันทึกที่ต้องคงอยู่ไปอีกหลายทศวรรษ สีที่เลื่อนไปมาคือข้อบกพร่อง ต้นทุนไม่ใช่เรื่องนามธรรม มันคือการพิมพ์ซ้ำ ปรู๊ฟที่ถูกปฏิเสธ หรือคลังเอกสารที่หน้าต่างๆไม่ตรงกับต้นฉบับอีกต่อไป การแก้ไขไม่ใช่ตัวเลขที่ดีกว่า แต่คือการบอกความจริงว่าตัวเลขนั้นหมายถึงอะไร

  • สีที่ขึ้นกับอุปกรณ์ (Device color) ตั้งชื่อสีด้วยค่าควบคุมที่อุปกรณ์ได้รับ ดังนั้นผลลัพธ์จึงเป็นอะไรก็ตามที่อุปกรณ์นั้นทำกับมัน (Spec: ISO 32000-2, §8.6.4) DeviceRGB, DeviceCMYK และ DeviceGray คือ device color space ตัวเลขเดียวกัน ฮาร์ดแวร์ต่างกัน สีก็ต่างกัน
  • สีที่ผ่านการคาลิเบรตและอ้างอิง ICC (Calibrated, ICC-based color) ผูกตัวเลขเหล่านั้นเข้ากับ ค่าอ้างอิงที่วัดได้และไม่ขึ้นกับอุปกรณ์ผ่านโปรไฟล์ที่ฝังไว้ (Spec: ISO 32000-2, §8.6.5.5) ตอนนี้เอกสาร พกข้อมูลพอที่จะสร้างสีที่ ตั้งใจ ไว้ขึ้นมาใหม่ ไม่ใช่เพียงสูตรของค่าควบคุม
  • ICC profile คือการแมปที่วัดได้นั้น คือตัวเลขของอุปกรณ์ — หรือ ตัวเลขของ color space มาตรฐานหรือ output condition — สัมพันธ์กับสีที่ ตาของมนุษย์จะรับรู้อย่างไร โดยอ้างอิงกับ connection space ที่ไม่ขึ้นกับอุปกรณ์
  • Rendering intent คือนโยบายว่าจะทำอย่างไรเมื่อสีอยู่นอกขอบเขตที่ อุปกรณ์เข้าถึงได้ เพราะไม่มีอุปกรณ์ใดแสดงทุกสีได้
  • Output intent คือการที่เอกสารประกาศไว้ล่วงหน้าถึง output condition ที่มันถูกเตรียมมาเพื่อสิ่งนั้น (Spec: ISO 32000-2, §14.11.5) เวิร์กโฟลว์ระดับงานพิมพ์ (PDF/X) และการจัดเก็บถาวร (PDF/A) ต้องพึ่งพามัน

เริ่มจากปัญหาฉบับที่บอกความจริง DeviceRGB ไม่ได้บรรจุสีไว้ในตัวมัน มันบรรจุตัวเลขสามค่าระหว่าง 0 ถึง 1 และข้อสมมติที่ไม่ได้พูดออกมาว่าจอบางจอจะเปลี่ยนมันให้เป็นแสง จอสองจอที่มีไฟส่องหลังต่างกัน พาเนลต่างกัน และการคาลิเบรตต่างกัน จะเปลี่ยนตัวเลขสามค่าเดียวกันให้เป็นแสงที่ต่างกันอย่างเห็นได้ชัด นั่นไม่ใช่บั๊กใน PDF มันคือความหมายของ “สีที่ขึ้นกับอุปกรณ์” และมาตรฐานก็พูดตรงไปตรงมาเรื่องนี้ คือ device color space ถูกนิยามด้วยค่าที่อุปกรณ์ได้รับ ไม่ใช่ด้วยหน้าตาแบบสัมบูรณ์ (Spec: ISO 32000-2, §8.6.4)

สีที่ผ่านการคาลิเบรตปิดช่องว่างนั้นด้วยการเพิ่มค่าอ้างอิงเข้าไป ICC profile คือผลลัพธ์ของการระบุลักษณะเฉพาะของอุปกรณ์หรือ color space — จอภาพ เครื่องพิมพ์ แท่นพิมพ์ หรือ space มาตรฐานเช่น sRGB — และบันทึกว่าตัวเลขดิบของมันสัมพันธ์กับสีใน connection space ที่ไม่ขึ้นกับอุปกรณ์ซึ่งประมาณการมองเห็นของมนุษย์อย่างไร ฝังโปรไฟล์นั้นเข้าไปแล้วตัวเลขก็เลิกเป็นภาษาเฉพาะส่วนตัว มันกลายเป็นคำกล่าวที่อ้างอิงกับสิ่งที่ทุกคนเห็นพ้องกันได้ นั่นคือสิ่งที่ ICC-based color space พกพาไว้พอดี (Spec: ISO 32000-2, §8.6.5.5) คือตัวสี บวกกับการแมปที่วัดได้ซึ่งบอกว่ามันหมายถึงอะไร

ยังมีอีกหนึ่งความซับซ้อนที่เลี่ยงไม่ได้ ชุดสีที่แท่นพิมพ์พิมพ์ได้ไม่ใช่ชุดที่โทรศัพท์แสดงได้ และทั้งคู่ก็ไม่ใช่ชุดเต็มที่ตาของมนุษย์มองเห็น เมื่อสีหนึ่งตกอยู่นอกขอบเขตที่อุปกรณ์เป้าหมายสร้างขึ้นมาใหม่ได้ ต้องมีการตัดสินใจอย่างใดอย่างหนึ่ง คือตัดมันให้เหลือสีที่เข้าถึงได้ใกล้ที่สุด หรือเลื่อนช่วงสีทั้งช่วงไปด้วยกันเพื่อให้ความสัมพันธ์ระหว่างสียังคงอยู่ ทางเลือกนั้นคือ rendering intent — นโยบายโดยจงใจที่เลือกมาเพื่องานนั้น ไม่ใช่อุบัติเหตุจากการปัดเศษ ภาพถ่ายและโลโก้องค์กรมักต้องการ intent ต่างกัน เพราะอย่างหนึ่งใส่ใจไล่เฉดที่นุ่มนวล ส่วนอีกอย่างใส่ใจการได้สีตัวอย่างที่เป๊ะ

ในที่สุด เอกสารที่กำลังจะเดินทางไปยังที่เฉพาะเจาะจงก็สามารถบอกได้ Output intent คือไฟล์ที่ประกาศ output condition ที่มันถูกเตรียมมาเพื่อสิ่งนั้น — โดยทั่วไปคือ ICC destination profile ที่ฝังไว้ซึ่งระบุชื่อ print condition หรืออุปกรณ์ (Spec: ISO 32000-2, §14.11.5) มันคือความแตกต่างระหว่างการยื่นไฟล์ให้เครื่องพิมพ์กับการยื่นไฟล์ที่บอกว่า “ฉันถูกสร้างมาเพื่อแท่นพิมพ์ เครื่องนี้” โปรไฟล์สำหรับการแลกเปลี่ยนงานพิมพ์ทำให้มันเป็นข้อบังคับ คือไฟล์ PDF/X (ตระกูล ISO 15930) ถูกกำหนดให้ต้องพก output intent (Spec: ISO 15930, PDF/X) และ PDF/A ก็พึ่งพากลไกเดียวกัน เพื่อให้สีที่ขึ้นกับอุปกรณ์ของไฟล์ที่จัดเก็บถาวรยังคงตีความได้ในอนาคตอันไกล นานหลังจากที่สภาพแวดล้อมต้นทางหายไปแล้ว

  1. Name the colourChoose a colour space. DeviceRGB/CMYK/Gray name control values; an ICC-based space anchors them to a device-independent reference (ISO 32000-2 §8.6).
  2. Anchor it (optional but decisive)Embed an ICC profile so the numbers carry their measured meaning, not just a device recipe (ISO 32000-2 §8.6.5.5).
  3. Reconcile to the deviceA rendering intent decides what happens to colours the target device cannot reproduce — clip the nearest, or shift the range to preserve relationships.
  4. Declare the destinationAn output intent states the output condition the document was prepared for, as PDF/X and PDF/A workflows require (ISO 32000-2 §14.11.5).
วิธีที่สีหนึ่งเดินทางจากโค้ดของคุณไปสู่ผลลัพธ์ที่ซื่อตรง คือมันถูกตั้งชื่อใน colour space ได้รับการอ้างอิงกับค่าอ้างอิงที่วัดได้โดย ICC profile (เป็นทางเลือก) ถูกประนีประนอมให้เข้ากับอุปกรณ์เป้าหมายผ่าน rendering intent และถูกตีความเทียบกับ output condition ที่เอกสารประกาศไว้

หน้าที่ของ NextPDF ในห่วงโซ่นี้คือการถูกต้องตามมาตรฐาน คือเขียน color space โปรไฟล์ที่ฝังไว้ และ output intent ในแบบที่รูปแบบไฟล์นิยามไว้ เพื่อให้เครื่องมือปลายทาง — RIP ของเครื่องพิมพ์ ตัวตรวจสอบความถูกต้องสำหรับการจัดเก็บถาวร โปรแกรมอ่าน — อ่านได้ตรงตามที่ตั้งใจไว้พอดี มันสร้างคำประกาศเหล่านั้น มันไม่ได้แสร้งทำเป็นอุปกรณ์

โครงร่างด้านล่างร่างการตัดสินใจไว้ ไม่ใช่ API เฉพาะตัวใด ประเด็นคือปลายทางถูก ระบุไว้ ไม่ใช่ถูกเดา

<?php
declare(strict_types=1);
use NextPDF\Contracts\PdfDocumentInterface;
/**
* Prepare a print-bound document that declares its intended output condition.
*
* The colour numbers alone do not fix the appearance. Declaring the output
* intent — the print condition the file was built for — is what lets a press
* interpret those numbers faithfully (ISO 32000-2 §14.11.5).
*
* @param PdfDocumentInterface $doc A composed document.
* @param string $iccProfileBytes The destination ICC profile for the
* target print condition.
*
* @return string The document bytes, carrying a declared output intent.
*/
function prepareForPress(
PdfDocumentInterface $doc,
string $iccProfileBytes,
): string {
// Declare the output condition explicitly. The document now states the
// device/print condition it was prepared for, instead of leaving its
// device colours open to interpretation.
$doc->setOutputIntent(
identifier: 'Custom press condition',
iccProfile: $iccProfileBytes,
);
return $doc->output();
}

สีไม่ได้เปลี่ยน สิ่งที่เปลี่ยนคือตอนนี้ไฟล์บอกแล้วว่ามันถูกตั้งใจให้มีหน้าตาอย่างไร ซึ่งเป็นสิ่งเดียวที่แท่นพิมพ์หรือตัวตรวจสอบความถูกต้องลงมือทำตามได้

“มันคือค่า hex เดียวกัน ดังนั้นมันก็คือสีเดียวกัน” ค่า hex คือชุดของค่าควบคุมอุปกรณ์ หากไม่มีโปรไฟล์หรือ output intent มันก็เป็นสูตรที่ไม่ได้ระบุครัวไว้ — มันจะมีรสชาติต่างกันในทุกครัว ไฟล์สองไฟล์สามารถพกตัวเลข RGB ที่เหมือนกันทุกประการ แต่เป็นสีที่ต่างกันอย่างซื่อตรงได้ เพราะไฟล์หนึ่งประกาศบริบทที่ให้ความหมายแก่ตัวเลข ส่วนอีกไฟล์ปล่อยให้เป็นไปตามโชค

กับดักที่สอง คือการสันนิษฐานว่า DeviceCMYK หมายถึง “พร้อมพิมพ์” โดยอัตโนมัติ มันไม่ใช่เช่นนั้น CMYK ก็ยังเป็น device color มันถูกหล่อหลอมมาในรูปแบบของแท่นพิมพ์ แต่มันยังไม่ผ่านการคาลิเบรตจนกว่าจะมีโปรไฟล์หรือ output intent ระบุชื่อ press condition จริงๆ

NextPDF สร้างสีที่ถูกต้องตามมาตรฐาน คือเขียน device และ ICC-based color space และประกาศ output intent สำหรับเวิร์กโฟลว์แบบ PDF/X และ PDF/A ในแบบที่รูปแบบไฟล์นิยามไว้ นั่นคือครึ่งหนึ่งของงานในฝั่งการสร้าง และเป็นครึ่งที่เอกสารเป็นเจ้าของได้

สิ่งที่ NextPDF ไม่เป็นคือระบบพิสูจน์สี (color-proofing) มันไม่ได้วัดจอภาพของคุณ ไม่ได้ทำ soft-proof งานพิมพ์บนหน้าจอ และไม่ได้รับรองว่าผลที่พิมพ์ออกมาตรงกับสีตัวอย่างที่ตั้งใจไว้ภายในค่าความคลาดเคลื่อนที่กำหนด สิ่งเหล่านั้นเป็นของห่วงโซ่การพิสูจน์สีที่จัดการสีและของคนที่ดูแลมัน เอนจินทำให้ไฟล์บอกสิ่งที่ถูกต้อง ส่วนอุปกรณ์ปลายทางจะทำตามหรือไม่นั้น ถูกตัดสินที่ปลายทาง โดยอุปกรณ์ โดย ICC profile ที่เกี่ยวข้อง และ — สำหรับ PDF/X และ PDF/A — โดยตัวตรวจสอบความถูกต้อง ไม่ใช่โดยผู้สร้าง

  • Device color space — สีที่ตั้งชื่อด้วยค่าควบคุมที่อุปกรณ์ได้รับ (DeviceRGB, DeviceCMYK, DeviceGray) หน้าตาขึ้นอยู่กับ อุปกรณ์ที่ตีความมัน (ISO 32000-2 §8.6.4)
  • Calibrated / ICC-based color — สีที่อ้างอิงกับค่าอ้างอิงที่ไม่ขึ้นกับ อุปกรณ์ผ่าน ICC profile ที่ฝังไว้ เพื่อให้หน้าตาที่ตั้งใจไว้สร้างขึ้นใหม่ได้ ข้ามอุปกรณ์ (ISO 32000-2 §8.6.5.5)
  • ICC profile — การแมปที่วัดได้ระหว่างตัวเลขของอุปกรณ์เฉพาะตัวกับ ค่าอ้างอิงที่ไม่ขึ้นกับอุปกรณ์ซึ่งประมาณการมองเห็นของมนุษย์
  • Rendering intent — นโยบายสำหรับจัดการสีที่อุปกรณ์เป้าหมาย สร้างขึ้นใหม่ไม่ได้ คือตัดให้เหลือสีที่เข้าถึงได้ใกล้ที่สุด หรือเลื่อนช่วงสีเพื่อ รักษาความสัมพันธ์ระหว่างสี
  • Output intent — การที่เอกสารประกาศ output condition ที่มันถูก เตรียมมาเพื่อสิ่งนั้น โดยทั่วไปผ่าน ICC destination profile ที่ฝังไว้ (ISO 32000-2 §14.11.5) เป็นข้อบังคับของ PDF/X และถูกใช้โดย PDF/A
  • PDF/X — ตระกูลโปรไฟล์สำหรับการแลกเปลี่ยนงานพิมพ์ ISO 15930 ของ PDF ไฟล์ PDF/X ต้องพก output intent ที่ระบุชื่อ print condition เป้าหมายของมัน