THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Đầu trang

Khai báo một đối tượng luồng gián tiếp Function Type 0 (Sampled) của PDF 1.3+ (ISO 32000-1 7.10.2). Sampled function biểu diễn một ánh xạ vào-ra tùy ý dưới dạng lưới đều N chiều với các mẫu đầu ra M chiều; bộ dựng nội suy tuyến tính giữa các điểm lưới để tính các giá trị đầu vào trung gian. Dùng khi cơ chế ICC profile là quá nặng nhưng vẫn cần một bảng tra được tinh chỉnh thủ công - các đường cong tông cho /TransferFunction (ExtGState /TR), tint transform lấy mẫu cho /Separation hoặc /DeviceN (thay cho các nhánh Type 2 tuyến tính / Type 4 số học), các đường cong ngưỡng halftone, hoặc bất kỳ cấu trúc PDF nào chấp nhận một Function dictionary

 

Cú pháp Delphi:

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ú pháp C++:

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

 

Mô tả

Hàm được phát ra dưới dạng một luồng gián tiếp với các mục /FunctionType 0, /Domain, /Range, /Size, /BitsPerSample/Order được cung cấp, cùng với luồng mẫu nhị phân thô. /Encode/Decode bị bỏ qua để dùng mặc định của spec: /Encode ánh xạ mỗi đầu mút Domain tới phạm vi lưới [0..Size[i]-1], còn /Decode khớp với /Range (các mẫu được giải gói thành số nguyên rồi ánh xạ tuyến tính trở lại các đầu mút Range). Với hàm nhiều đầu vào, thứ tự byte của mẫu tuân theo quy tắc PDF 1.7 "tọa độ đầu vào tăng nhanh nhất theo chiều đầu vào thứ nhất", tức độ lệch byte cho điểm lưới (i_0, i_1, ..., i_{N-1}) với M đầu ra là ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - tùy chọn, mặc định 1. Chấp nhận 1 (nội suy tuyến tính, mặc định của PDF 1.7) hoặc 3 (nội suy spline bậc ba) theo PDF 1.7 Table 38. Kiểu cubic cho chuyển tiếp mượt hơn ở mật độ lưới mẫu thấp (ví dụ đường cong tông ICC 17 điểm) nhưng một số trình đọc di động cũ sẽ lặng lẽ rơi về linear khi gặp giá trị Order mà chúng không hỗ trợ. Có từ HotPDF v2.54.0

Với trường hợp đầu vào ASCII - đường authoring điển hình - một hàm 1 đầu vào / M đầu ra với BitsPerSample = 8Size = [256] cho ra một LUT 256 mẫu mà luồng của nó đúng bằng 256 * M byte được sắp xếp thành (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N giá trị Single, theo thứ tự [in0Min in0Max in1Min in1Max ...]. Hàm kẹp các giá trị đầu vào về phạm vi này trước khi nội suy. N được xác định từ Length(Domain) div 2

Range - 2M giá trị Single có cùng dạng cho M chiều đầu ra; các mẫu đầu ra được kẹp về phạm vi này sau khi giải mã

Size - N số nguyên cho biết số điểm lưới dọc theo từng trục đầu vào. Length(Size) phải bằng N. Tổng số điểm lưới là tích của tất cả các mục Size

BitsPerSample - một trong các giá trị 1, 2, 4, 8, 12, 16, 24 hoặc 32 theo PDF 1.7 Table 38. 8 là lựa chọn thuận tiện nhất (luồng byte thô); 16 đến 32 là các độ rộng big-endian canh byte; 1 / 2 / 4 / 12 yêu cầu đóng gói bit theo MSB trước với byte cuối được đệm 0 đến ranh giới byte. Mọi giá trị khác sẽ gây ra ngoại lệ

Samples - luồng mẫu nhị phân thô đã được đóng gói bit. Độ dài phải ít nhất bằng ceil(GridPoints * M * BitsPerSample / 8) byte. HotPDF sao chép nguyên byte được cung cấp vào đối tượng luồng gián tiếp; việc đóng gói bit đúng là trách nhiệm của bên gọi

 

Giá trị trả về: đối tượng THPDFStreamObject gián tiếp để người gọi có thể gắn nó ở bất kỳ nơi nào cần một Function dictionary (thường bằng cách truyền tham chiếu gián tiếp của nó vào một dict khác qua AddValue, hoặc cho một bộ dựng shading / separation). Đối tượng này thuộc danh sách IndirectObjects của tài liệu và sẽ được giải phóng khi tài liệu kết thúc. Trả về nil khi StrictVersionLock bật và Version hiện tại thấp hơn PDF 1.3 (nếu không, phiên bản tài liệu sẽ tự nâng lên 1.3)

 

Ví dụ mã

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

 

Xem thêm

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support