THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

ด้านบน

ประกาศออบเจกต์สตรีมทางอ้อม PDF 1.3+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2) ฟังก์ชันตัวอย่างจะแสดงการแมปอินพุตกับเอาต์พุตตามความต้องการในรูปแบบกริด N มิติตามปกติของตัวอย่างเอาต์พุต M มิติ ตัวประมวลผลจะทำการประมาณค่าแบบเชิงเส้นระหว่างจุดกริดเพื่อประเมินค่าอินพุตระดับกลาง ใช้ตัวเลือกนี้เมื่อกลไกโปรไฟล์ ICC มีความซับซ้อนเกินไปแต่ต้องการตารางค้นหาแบบปรับแต่งด้วยตนเอง เช่น โทนเคิร์ฟสำหรับ /TransferFunction (ExtGState /TR), การแปลงสีที่สุ่มตัวอย่างสำหรับ /Separation หรือ /DeviceN (เป็นอีกทางเลือกหนึ่งนอกเหนือจากพาธเชิงเส้น Type 2 / เลขคณิต Type 4), กราฟระดับเกณฑ์ฮาล์ฟโทน หรือโครงสร้าง PDF อื่นๆ ที่รองรับพจนานุกรม Function

 

Delphi syntax:

function RegisterSampledFunction(const Domain: array of Single; const Range: array of Single; const Size: array of Integer; BitsPerSample: Integer; const Samples: array of byte; Order: Integer = 1): THPDFStreamObject;

 

C++ syntax:

THPDFStreamObject* RegisterSampledFunction(const float* Domain, int DomainCount, const float* Range, int RangeCount, const int* Size, int SizeCount, int BitsPerSample, const unsigned char* Samples, int SamplesCount, int Order = 1);

 

คำอธิบาย

ฟังก์ชันจะถูกส่งออกเป็นสตรีมทางอ้อมที่มี /FunctionType 0, รายการ /Domain, /Range, /Size, /BitsPerSample และ /Order ที่ให้ไว้ รวมทั้งสตรีมตัวอย่างแบบแพ็คบิตดิบด้วย โดยไม่มีการรวม /Encode และ /Decode เพื่อให้เป็นไปตามค่าเริ่มต้นของข้อกำหนด: /Encode จะแมปแต่ละตำแหน่งปลายทางของ Domain ไปยังขอบเขตกริด [0..Size[i]-1] และ /Decode จะจับคู่กับ /Range (ตัวอย่างจะถูกคลายออกเป็นจำนวนเต็มและแมปแบบเชิงเส้นกลับไปที่ตำแหน่งปลายทางของ Range) สำหรับฟังก์ชันที่มีหลายอินพุต ลำดับไบต์ตัวอย่างจะเป็นไปตามกฎ PDF 1.7 "พิกัดอินพุตจะเพิ่มขึ้นเร็วที่สุดตามมิติอินพุตแรก" กล่าวคือ ไบต์ออฟเซตสำหรับจุดกริด (i_0, i_1, ..., i_{N-1}) ที่มีเอาต์พุต M ตัวคือ ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - ไม่บังคับ, ค่าเริ่มต้นคือ 1 รองรับค่า 1 (การประมาณค่าเชิงเส้น, ค่าเริ่มต้นของ PDF 1.7) หรือ 3 (การประมาณค่าแบบสปไลน์ลูกบาศก์) ตามตาราง PDF 1.7 Table 38 วิธีการแบบลูกบาศก์จะช่วยให้การเปลี่ยนผ่านราบรื่นยิ่งขึ้นที่ความหนาแน่นกริดตัวอย่างต่ำ (เช่น โทนเคิร์ฟ ICC แบบ 17 จุด) แต่โปรแกรมอ่านบนมือถือรุ่นเก่าบางรุ่นจะเปลี่ยนกลับเป็นแบบเชิงเส้นโดยอัตโนมัติเมื่อพบค่า Order ที่ไม่ได้ปรับใช้ มีให้ใช้งานตั้งแต่ HotPDF v2.54.0

สำหรับกรณีการใช้งานที่รับข้อมูลเข้าเป็น ASCII - พาธการสร้างแบบทั่วไป - ฟังก์ชันแบบ 1 อินพุต / M เอาต์พุตเดี่ยวที่มี BitsPerSample = 8 และ Size = [256] จะให้ LUT ขนาด 256 ตัวอย่างซึ่งมีสตรีมเท่ากับ 256 * M ไบต์พอดี จัดเรียงเป็น (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - ค่าเดี่ยวแบบ 2N เรียงลำดับเป็น [in0Min in0Max in1Min in1Max ...] ฟังก์ชันนี้จะจำกัดค่าที่เข้ามาให้อยู่ในช่วงนี้ก่อนการประมาณค่าในช่วง โดยหาค่า N ได้จาก Length(Domain) div 2

Range - ค่าเดี่ยวแบบ 2M ที่มีรูปแบบเดียวกันสำหรับขนาดเอาต์พุต M ตัวอย่างเอาต์พุตจะถูกจำกัดให้อยู่ในช่วงนี้หลังจากการถอดรหัส

Size - จำนวนเต็ม N ตัวที่ระบุจำนวนจุดกริดตามแกนอินพุตแต่ละแกน ความยาว Length(Size) ต้องเท่ากับ N จุดกริดทั้งหมดคือผลคูณของรายการ Size ทั้งหมด

BitsPerSample - หนึ่งในค่า 1, 2, 4, 8, 12, 16, 24 หรือ 32 ตามตาราง PDF 1.7 Table 38 โดยค่า 8 เป็นตัวเลือกที่เหมาะสม (สตรีมไบต์ดิบ) ส่วนค่า 16 ถึง 32 คือความกว้างที่เป็นแบบ big-endian แบบจัดเรียงตามไบต์ และค่า 1 / 2 / 4 / 12 จะต้องใช้การแพ็คบิตแบบ MSB-first โดยไบต์สุดท้ายจะถูกแพดด้วยศูนย์ให้ตรงกับขอบเขตไบต์ ค่าอื่นๆ จะทำให้เกิดข้อผิดพลาด

Samples - สตรีมตัวอย่างแบบแพ็คบิตดิบ ความยาวต้องไม่น้อยกว่า ceil(GridPoints * M * BitsPerSample / 8) ไบต์ HotPDF จะคัดลอกไบต์ที่จัดเตรียมไว้ทุกประการลงในออบเจกต์สตรีมทางอ้อม ความถูกต้องของการแพ็คบิตเป็นความรับผิดชอบของผู้เรียก

 

ค่าที่ส่งคืน: THPDFStreamObject ทางอ้อมเพื่อให้ผู้เรียกสามารถเชื่อมต่อได้ทุกที่ที่คาดหวังพจนานุกรม Function (โดยทั่วไปส่งผ่านการอ้างอิงทางอ้อมไปยังพจนานุกรมอื่นผ่าน AddValue หรือไปยังตัวสร้างไล่โทนสี / แยกสี) ออบเจกต์นี้มีรายชื่อ IndirectObjects ของเอกสารเป็นเจ้าของและจะถูกล้างข้อมูลเมื่อสิ้นสุดเอกสาร ส่งคืน nil เมื่อเปิด StrictVersionLock และเวอร์ชันปัจจุบันต่ำกว่า PDF 1.3 (ไม่เช่นนั้น เวอร์ชันของเอกสารจะถูกปรับขึ้นเป็น 1.3 โดยอัตโนมัติ)

 

Code Example

// 256-sample 1-input / 3-output (RGB) heatmap LUT. The LUT maps a
// scalar t in [0..1] to a blue -> green -> red gradient through the
// midpoint
uses
  HPDFObjs;

var
  Func: THPDFStreamObject;
  Domain: array[0..1] of Single;
  Range: array[0..5] of Single;
  Size: array[0..0] of Integer;
  Samples: array[0..767] of byte;   // 256 grid points * 3 outputs
  I: Integer;
  T: Single;
begin
  HPDF.BeginDoc;
  // 1 input dim: t in [0..1]
  Domain[0] := 0; Domain[1] := 1;
  // 3 output dims: each in [0..1]
  Range[0] := 0; Range[1] := 1;
  Range[2] := 0; Range[3] := 1;
  Range[4] := 0; Range[5] := 1;
  // 256 sample points along the single input axis
  Size[0] := 256;

  for I := 0 to 255 do
  begin
    T := I / 255.0;
    if T < 0.5 then
    begin
      Samples[I*3 + 0] := 0;
      Samples[I*3 + 1] := byte(Round(2.0 * T * 255.0));
      Samples[I*3 + 2] := byte(Round((1.0 - 2.0*T) * 255.0));
    end
    else
    begin
      Samples[I*3 + 0] := byte(Round(2.0 * (T - 0.5) * 255.0));
      Samples[I*3 + 1] := byte(Round((1.0 - 2.0*(T - 0.5)) * 255.0));
      Samples[I*3 + 2] := 0;
    end;
  end;
  Func := HPDF.RegisterSampledFunction(Domain, Range, Size, 8, Samples);
  // Func is now an indirect THPDFStreamObject the caller can attach
  // to any PDF dict slot that accepts a Function reference
  HPDF.EndDoc;
end;

 

ดูเพิ่มเติม

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, การสนับสนุนตัวกรอง PDF