THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Κορυφή

Δηλώνει ένα έμμεσο αντικείμενο ροής PDF 1.2+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2). Οι συναρτήσεις δειγματοληψίας εκφράζουν μια αυθαίρετη αντιστοίχιση εισόδου σε έξοδο ως κανονικό πλέγμα N διαστάσεων από δείγματα εξόδου M διαστάσεων· ο αποτυπωτής παρεμβάλλει μεταξύ σημείων του πλέγματος για να αξιολογήσει ενδιάμεσες εισόδους. Χρησιμοποιήστε το όταν ο μηχανισμός προφίλ ICC είναι υπερβολικός αλλά χρειάζεται χειροκίνητα ρυθμισμένος πίνακας αναζήτησης, όπως καμπύλες τόνων για /TransferFunction (ExtGState /TR), μετασχηματισμοί απόχρωσης δειγματοληψίας για /Separation ή /DeviceN, καμπύλες ορίου ημιτονισμού ή κάθε άλλη κατασκευή 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, καθώς και με την ακατέργαστη ροή δειγμάτων συσκευασμένη σε bit. Τα /Encode και /Decode παραλείπονται ώστε να ισχύουν οι προεπιλογές της προδιαγραφής: το /Encode αντιστοιχίζει κάθε άκρο Domain στα όρια πλέγματος [0..Size[i]-1] και το /Decode ταιριάζει με το /Range. Για συναρτήσεις πολλών εισόδων, η σειρά byte των δειγμάτων ακολουθεί τον κανόνα PDF 1.7 ότι οι συντεταγμένες εισόδου αυξάνονται ταχύτερα κατά την πρώτη διάσταση εισόδου, δηλαδή η μετατόπιση byte για σημείο πλέγματος (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 (παρεμβολή κυβικού spline) σύμφωνα με τον Πίνακα 38 του PDF 1.7. Το κυβικό δίνει ομαλότερες μεταβάσεις σε χαμηλή πυκνότητα πλέγματος δειγμάτων, αλλά ορισμένες παλαιότερες εφαρμογές ανάγνωσης κινητών επιστρέφουν σιωπηρά στη γραμμική μέθοδο όταν συναντούν τιμή Order που δεν υλοποιούν. Διαθέσιμο από HotPDF v2.54.0

Για περιπτώσεις εισόδου ASCII, τη συνήθη διαδρομή σύνταξης, μία συνάρτηση με μία είσοδο και M εξόδους με BitsPerSample = 8 και Size = [256] δίνει LUT 256 δειγμάτων, του οποίου η ροή είναι ακριβώς 256 * M byte με διάταξη (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N τιμές Single, με διάταξη [in0Min in0Max in1Min in1Max ...]. Η συνάρτηση περιορίζει τις εισερχόμενες τιμές σε αυτό το εύρος πριν από την παρεμβολή. Το N προσδιορίζεται από Length(Domain) div 2

Range - 2M τιμές Single με την ίδια μορφή για τις M διαστάσεις εξόδου· τα δείγματα εξόδου περιορίζονται σε αυτό το εύρος μετά την αποκωδικοποίηση

Size - N ακέραιοι που δίνουν το πλήθος σημείων πλέγματος κατά μήκος κάθε άξονα εισόδου. Το Length(Size) πρέπει να ισούται με N. Το συνολικό πλήθος σημείων πλέγματος είναι το γινόμενο όλων των εγγραφών Size

BitsPerSample - μία από τις τιμές 1, 2, 4, 8, 12, 16, 24 ή 32 σύμφωνα με τον Πίνακα 38 του PDF 1.7. Το 8 είναι η πρακτική επιλογή για ακατέργαστη ροή byte· από 16 έως 32 είναι πλάτη big-endian ευθυγραμμισμένα σε byte· τα 1, 2, 4 και 12 απαιτούν συσκευασία bit με MSB πρώτο και το τελικό byte συμπληρωμένο με μηδενικά έως το όριο byte. Κάθε άλλη τιμή δημιουργεί εξαίρεση

Samples - η ακατέργαστη ροή δειγμάτων συσκευασμένη σε bit. Το μήκος πρέπει να ισούται με ceil(GridPoints * M * BitsPerSample / 8) byte, περιλαμβάνοντας μόνο τη συμπλήρωση του τελικού byte όπου απαιτείται. Το HotPDF επαληθεύει κάθε υποστηριζόμενο συσκευασμένο βάθος και αντιγράφει τα παρεχόμενα byte αυτούσια στο έμμεσο αντικείμενο ροής· η ορθότητα της συσκευασίας bit είναι ευθύνη του καλούντος

Η αξιολόγηση φορτωμένης σελίδας υποστηρίζει μία έως τέσσερις εισόδους και εξόδους, ρητό εμπρόσθιο ή αντίστροφο /Encode, ανεξάρτητο /Decode, πολυγραμμικό /Order 1, πολυδιάστατο κυβικό /Order 3 και μονοδιάστατα φυσικά κυβικά splines. Τα επικυρωμένα byte δειγμάτων και τα μεταδεδομένα παρεμβολής διατηρούνται σε LRU οκτώ εγγραφών και 64 MiB για επαναλαμβανόμενες κλήσεις απόχρωσης, σκίασης, soft-mask και συνάρτησης μεταφοράς. Διαθέσιμο από HotPDF v2.544.0

 

Τιμή επιστροφής: το έμμεσο THPDFStreamObject, ώστε ο καλών να μπορεί να το επισυνάψει όπου αναμένεται λεξικό Function, συνήθως περνώντας την έμμεση αναφορά του σε άλλο λεξικό με AddValue. Το αντικείμενο ανήκει στη λίστα IndirectObjects του εγγράφου και απελευθερώνεται στο τέλος του εγγράφου. Επιστρέφει nil όταν το StrictVersionLock είναι ενεργό και η ενεργή Version είναι κάτω από PDF 1.2, διαφορετικά η έκδοση του εγγράφου αυξάνεται αυτόματα σε 1.2

 

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;

 

See Also

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support