THotPDF.RegisterSampledFunction-metode

 

THotPDF.RegisterSampledFunction

THotPDF

 

Øverst
Placeholder for topic body

Erklærer et PDF 1.3+ Funktion Type 0 (Sampled) indirekte strømobjekt (ISO 32000-1 7.10.2); samplede funktioner udtrykker en vilkårlig input-til-output-tilknytning som et regelmæssigt N-dimensionalt gitter af M-dimensionale output-samples; gengiveren interpolerer lineært mellem gitterpunkter for at evaluere mellemliggende input; brug dette, hvor ICC-profilmaskineri er overflødigt, men der ønskes en manuelt tilpasset opslagstabel - tonekurver for/TransferFunction (ExtGState /TR), samplede nuancetransformationer for/Separation or /DeviceN(alternativ til de lineære Type 2 / aritmetiske Type 4-stier), halvtonetærskelkurver eller enhver anden PDF-konstruktion, der accepterer en Function-ordbog

 

Delphi-syntaks:

function RegisterSampledFunction(constDomain:array of Single; constRange:array of Single; constSize:array ofInteger; BitsPerSample: Integer;constSamples:array ofbyte; Order: Integer = 1): THPDFStreamObject;

 

C++-syntaks:

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

 

Beskrivelse

Funktionen udsendes som en indirekte stream med /FunctionType 0, de leverede /Domain-, /Range-, /Size-, /BitsPerSample- og /Order-poster samt den rå bitpakkede prøvestream. /Encode og /Decode udelades, så specifikationens standardværdier gælder: /Encode kortlægger hvert Domain-endepunkt til gitterudstrækninger [0..Size[i]-1], og /Decode matcher /Range. Prøver udpakkes til heltal og remappes lineært tilbage til Range-endepunkterne. Ved funktioner med flere input følger prøvebyte-rækkefølgen PDF 1.7-reglen 'input coordinates increase fastest along the first input dimension'

Order - valgfri, standard 1; accepterer 1 (lineær interpolation, PDF 1.7 standard) eller 3 (kubisk spline-interpolation) pr. PDF 1.7 tabel 38; kubisk giver blødere overgange ved lave prøvegittertætheder (f.eks. 17-punkts ICC-tonekurver), men nogle ældre mobillæsere falder lydløst tilbage til lineær, når de støder på en Order-værdi, de ikke implementerer; tilgængelig siden HotPDF v2.54.0

Ved brugsscenarier med ASCII-input - den typiske oprettelsessti - giver en enkelt 1-indgangs / M-udgangs funktion med BitsPerSample = 8 og Size = [256] en 256-prøve-LUT, hvis stream er nøjagtigt 256 * M bytes udlagt som (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N Single-værdier, ordnet[in0Min in0Max in1Min in1Max ...]; funktionen fastklemmer indkommende værdier til dette område før interpolation; N bestemmes ud fraLength(Domain) div 2.

Range - 2M Single-værdier med samme form for de M outputdimensioner; output-samples fastklemmes til dette område efter afkodning

Size - N heltal, der angiver antallet af gitterpunkter langs hver inputakseLength(Size)skal være lig med N; samlede gitterpunkter er produktet af alleSize entries

BitsPerSample - en af 1, 2, 4, 8, 12, 16, 24 eller 32 pr. PDF 1.7 tabel 388er det ergonomiske valg (rå bytestrøm);16 through 32er byte-justerede big-endian-bredder;1 / 2 / 4 / 12kræver MSB-først bitpakning med den sidste byte nul-polstret til en byte-grænse; enhver anden værdi udløser en undtagelse

Samples - den rå bitpakkede prøvestrøm; længden skal være mindstceil(GridPoints * M * BitsPerSample / 8)bytes; HotPDF kopierer de leverede bytes ordret til det indirekte strømobjekt; bitpakkens korrekthed er kalderens ansvar

 

Returværdi: det indirekteTHPDFStreamObjectså kaldere kan vedhæfte det, hvor der forventes en Function-ordbog (typisk ved at overføre dens indirekte reference til en anden ordbog viaAddValue, eller til en skyggelægnings-/separationsbygger); objektet ejes af dokumentets IndirectObjects-liste og frigives ved dokumentets afslutning; returnerernil when StrictVersionLocker aktiveret og den aktiveVersioner under PDF 1.3 (ellers opgraderes dokumentversionen automatisk til 1.3)

 

Kodeeksempel

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

 

Se også

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF-filterunderstøttelse