PDF-toiminnot ovat yksi spesifikaation hiljaisimmista kulmista. Useimmat kehittäjät kohtaavat ne kerran asiana, jota tyypin 2 aksiaalinen varjostus tarvitsee kahden värin häivyttämiseksi, eivätkä koskaan katso uudestaan. Se on sääli, koska toimintokoneisto on pieni yleiskäyttöinen arvioija, jota muoto käyttää uudelleen varjostuksiin, siirtotoimintoihin, puolivarjospottitoimintoihin, erotussävyihin ja pehmeiden peittokuvien siirtokäyriin. Neljästä toimintotyypistä tyyppi 0 on tehokkain ja vähiten ymmärretty. Se on näytteistetty funktio: lähtöarvojen moniulotteinen ruudukko, jonka välillä lukija interpoloi. Koska ruudukko voi sisältää mitä tahansa numeroita, joita siihen lisäät, tyypin 0 funktio voi ilmaista mielivaltaisen epälineaarisen kartoituksen, joka on värinhakutaulukon tarkka muoto
Tässä artikkelissa käsitellään Type 0 -sanakirjaa, kuten standardi ISO 32000-1 sen määrittelee kohdassa 7.10.2, ja esitellään kaksi tapettia, joilla on eniten merkitystä asiakirjaputkessa: kolmen sisääntulon RGB-RGB-värinkorjauksen LUT ja yhden syötteen pistevärin sävymuunnos. Sama näytteistetoimintojen rakentaja palvelee molempia, ja niiden välinen ero on täysin kysymys siitä, kuinka monta tuloa ruudukossa on
Näytteistetty funktio on ruudukko, jonka lukija interpoloi
Tyypin 0 funktio yhdistää m-tulo vektorin n-lähtö vektoriksi tallentamalla näytteitä tavalliseen ruudukkoon ja interpoloimalla niiden välillä. ISO 32000-1 §7.10.2 luettelee avaimet, jotka kuvaavat tätä ruudukkoa. /Domain sisältää kaksi numeroa kutakin tuloa kohti, kunkin tuloakselin ala- ja ylärajan. /Range sisältää kaksi lukua lähtökomponenttia kohti. /Size on joukko m kokonaislukua, jotka antavat näytteiden lukumäärän kullakin tuloakselilla, joten ruudukolla, joka on 12 näytettä sivulla kolmessa ulottuvuudessa, on /Size [12 12 12] ja tallentaa 1 728 ruudukkopistettä. /BitsPerSample asettaa jokaisen tallennetun arvon tarkkuuden; HotPDF hyväksyy 1, 2, 4, 8, 12, 16, 24 ja 32 bittiä taulukon 38 sallimien arvojen mukaisesti
Näytevirta luetaan kiinteässä järjestyksessä. Ensimmäinen tulo-ulottuvuus vaihtelee nopeimmin, sitten toinen ja niin edelleen, ja kussakin ruudukkopisteessä n -lähtökomponentit tallennetaan järjestyksessä. RGB-to-RGB-taulukolle, joka on kolme tavua ruudukkopistettä kohti kahdeksalla bitillä, esitettynä punainen, vihreä ulostulo, sininen lähtö, pyyhkäisty punaisen tulon yli ensin. Kaksi muuta avainta kartoittavat jatkuvan maailman kokonaislukuruudukkoon. /Encode kartoittaa jokaisen syötteen /Domain-välistä näyteindeksialueelle 0 kohteeseen Size[i] - 1, ja /Decode yhdistää raa'at tallennetut kokonaisluvut takaisin /Range-väleille. Kun jätät ne oletusasetuksiinsa, tulo, joka ylittää arvon [0 1], asettuu siististi koko ruudukolle ja tallennettu 255-tavu dekoodautuu tulostusalueensa yläosaan, mitä [0,1]-normalisoitu väri LUT haluaa
Tilaus 1 vastaan Tilaus 3
Lukijan on interpoloitava ruudukkopisteiden välissä, ja /Order valitsee kuinka. /Order 1 on monilineaarinen interpolointi: lineaarinen toista akselia pitkin, bilineaarinen toisen, trilineaarinen toisen poikki. Se on nopeaa, ja juuri näin useimmissa katseluohjelmissa laitteisto tekee, ja sujuvan värinmuutoksen saavuttamiseksi sitä ei yleensä voi erottaa mistään erikoisemmasta. /Order 3 pyytää kuutiosplit-interpolointia, joka sovittaa pehmeämmän käyrän näytteiden läpi, mikä maksaa enemmän työtä ja laajempaa tukialuetta jokaisen arvioidun pisteen ympärillä
Kompromissi on verkon tiheys käyrän sileyttä vastaan. Kuutiollinen järjestys ansaitsee paikkansa silloin, kun ruudukko on karkea ja kartoituksella on näkyvä kaarevuus, koska suora linja kahden kaukana toisistaan olevan näytteen välillä voi litistää sävykäyrää tavalla, jonka silmä tarttuu gradienteihin. Kun ruudukko on tiheä, segmentit ovat riittävän lyhyitä, jotta lineaarinen interpolointi seuraa käyrää tarkasti ja kuutiollinen ostaa vähän. Käytännön sääntö on tavoittaa /Order 3 vain pienillä ruudukoilla tai jyrkällä muutoksilla ja jättää se muutoin lineaariseen oletusasetukseen. Huomaa, että /Order koskee vain tyypin 0 toimintoja ja HotPDF hylkää kaikki muut arvot kuin 1 tai 3
3D LUT: kolme tuloa, kolme lähtöä
RGB-to-RGB-värinkorjaus on oppikirjatapaus kolmisyötteisestä ruudukosta, klassisesta 3D LUT:sta, jota käytetään värin luokittelussa ja laitteiden täsmäyksessä. Kuution kukin akseli on yksi syöttökanava, jokainen ruudukkopiste tallentaa kyseisen syöttökoordinaatin korjatun RGB-kolmion, ja lukija interpoloi kolmilineaarisesti minkä tahansa saapuvan värin kulmanäytteitä. Kolme syöttöä ovat tässä väistämättömiä, koska korjattu punainen voi riippua syötetystä vihreästä ja sinisestä, ei pelkästään syötetystä punaisesta; kanavakohtainen käyrä ei voi ilmaista kanavan ylikuulumista, mutta kuutio voi
HotPDF rakentaa Type 0 -virran komennon RegisterSampledFunction kautta, joka ottaa mallit /Domain, /Range, /Size, /BitsPerSample, ja näyttää tavuja suoraan ja palauttaa toiminto-objektin. Vakionormalisoidulle kuutiolle välität arvon [0,1] rajat kaikille kolmelle syöttöakselille ja kaikille kolmelle lähdölle, koon N x N x N ja litistetyn näytetaulukon. Rakentaja tarkistaa, että tavumäärä vastaa ruudukkoa: tavu-kohdistetulle syvyydelle se odottaa kohdetta OutputCount x (BitsPerSample div 8) x kokojen tulon ja nostaa sen, jos taulukko on vääränpituinen, joten väärin laskettu askelepäonnistuu kovaa rekisteröityessä pikemminkin kuin tuottamalla roskana myöhemmin
const
N = 17; // 17 x 17 x 17 kuutio, yhteinen ICC LUT-resoluutio
var
LutFn: THPDFStreamObject;
Samples: TBytes;
begin
// Täytä Samples N*N*N-ruudukkopisteillä, joista jokainen on 3 tavua (R, G, B-lähtö),
// punainen syöttö vaihtelee nopeimmin. Rakenna jokaiselle korjattu kolmio
// ruudukkokoordinaatti ICC:n hallinnoimalla tuloksella ja tallenna se sitten.
SetLength(Samples, N * N * N * 3);
BuildCorrectedCube(Samples, N); // värihallittu täyttösi
LutFn := Pdf.RegisterSampledFunction(
[0,1, 0,1, 0,1], // /Domain: kolme syöttöakselia kohteessa [0,1]
[0,1, 0,1, 0,1], // /Range: kolme lähtökanavaa kohteessa [0,1]
[N, N, N], // /Size: kuution resoluutio akselia kohden
8, // /BitsPerSample
Samples,
1); // /Order 1 = trilinear
end;
Kuution kolorimetrinen oikeellisuus piilee siinä, miten täytät sen, ei PDF-funktiossa. Rehellinen tapa on laskea kukin ruudukkopiste ICC-hallitun muunnoksen avulla, joka on sama moottori, joka ohjaa vedosta, jotta ruudukon numeroilla on merkitystä määritettyä lähde- ja kohdeprofiilia vastaan. Rekisteröi profiilit, jotka rajoittavat muunnosa komennolla RegisterICCProfile, joka tallentaa ICC-pohjaisen väriavaruuden (1, 3 tai 4 komponenttia) ja palauttaa resurssin nimen, jonka voit liittää LUT:n syöttämään sisältöön. Tyyppi 0 -funktio kantaa interpolointitaulukkoa; ICC-profiili sisältää päätepisteiden merkityksen
1D-tapaus: pistevärin sävyn muunnos
Erotusväriavaruudet tukeutuvat samaan koneistoon aivan toisessa työssä. ISO 32000-1 §8.6.6.4:ssä määritelty Separation-avaruus edustaa yhtä väriainetta, pistemustetta, kuten Pantonea tai lakkaa, yhdistämällä nimen sävymuunnokseen: toiminto, joka kartoittaa yksiulotteisen sävyarvon, 0 ei mustetta ja 1 täyttä mustetta, vaihtoehtoiseen väriavaruuteen, jonka laite voi todella renderöidä, yleensä CMYK. Tuo sävymuunnos on usein Type 0 -funktio, ja nyt ruudukossa on tasan yksi tuloakseli
Tämä on puhdas kontrasti 3D-LUT:n kanssa. Pistemusteella on yksi vapausaste, joten sen sävyn muuntaminen vaatii yhden sisääntulon ja ruudukko on rivi näytteitä, joista jokaisessa on CMYK- (tai muun vaihtoehtoisen) arvo kyseisellä sävytasolla. RGB-kuutio tarvitsee kolme sisääntuloa, koska sen alue on kolmiulotteinen ja kanavat ovat vuorovaikutuksessa. Sama toimintotyyppi, samat interpolointisäännöt, erilainen ulottuvuus; määrittely käyttää yhtä evaluoijaa uudelleen ja antaa koodin /Size päättää, käveletkö viivaa, tasoa vai kuutiota. HotPDF kiertää koko erottelun komennossa RegisterSeparationLUT, joka rakentaa yhden syötteen tyypin 0 sävymuunnoksen tasaisesta tavutaulukosta sisäisesti ja palauttaa väriavaruusresurssin nimen
var
SpotCS: AnsiString;
begin
// Neljä CMYK-tulostavua sävyruudukkopistettä kohden, sävyalue [0..1].
// Täällä 0 % mustetta -> kaikki nolla, 100 % mustetta -> runsas pisterakenne,
// kahdella sisäaskelmalla; sävyjen muutos interpoloi väliin.
SpotCS := Pdf.RegisterSeparationLUT(
'PANTONE 286 C', // väriaineen nimi
'DeviceCMYK', // vaihtoehtoinen väriavaruus
[ 0, 0, 0, 0, // sävy 0.00 -> 0,0,0,0
90, 60, 0, 0, // sävy 0.33
100, 80, 0, 10, // sävy 0.66
100, 72, 0, 18]); // sävy 1.00 -> täysi musteen kerääntyminen
// Käytä komentoa SpotCS komennoilla SetFillColorSpace / SetFillColor sivulla.
end;
Näytteiden lukumäärän on oltava kokonaisluku ruudukkopisteitä: vaihtoehtoisen tilan komponenttimäärän positiivinen kerrannainen ja vähintään kaksi pistettä, jotta on segmentti, joka voidaan interpoloida. Ohita kolme tavua pistettä kohti CMYK-vaihtoehtoa vasten ja kutsu hylkää sen, sama puolustava validointi, jota 3D-rakennin soveltaa, mitä haluatkin toiminnolta, joka muuten epäonnistuisi äänettömästi tulostusvaiheessa
Minne samat koneistot taas ilmestyvät
Kun näet tyypin 0 yleisenä interpolointitaulukkona, kaksi muuta laitteen ohjaustoimintoa lakkaavat näyttämästä erikoistapauksilta. Siirtotoiminto säätää komponenttien arvoja matkalla ulostulolaitteeseen, ja se on vain toiminto per kanava; HotPDF rekisteröi sen komennolla ExtGState komennon RegisterTransferFunctionState kautta, joka hyväksyy joko yhden yhdistetyn toiminnon tai taulukon kanavakohtaisia toimintoja. Koska nämä funktiot ovat tavallisia funktioobjekteja, voit ojentaa niille saman THPDFStreamObject:n, jonka RegisterSampledFunction palauttaa ja ohjata siirtokäyrän näyteistetystä taulukosta kaavan sijaan
var
ToneFn: THPDFStreamObject;
GsName: AnsiString;
begin
// Yhden syötteen, yhden ulostulon otostettu sävykäyrä kohdassa [0,1].
ToneFn := Pdf.RegisterSampledFunction(
[0,1], [0,1], [256], 8, ToneCurveBytes, 1);
// Käytä sitä kaikille kanaville yhdistettynä /TR2 siirtotoimintona.
GsName := Pdf.RegisterTransferFunctionState(ToneFn, []);
// Valitse sivuGName ennen kuin piirrät asianomaisen sisällön.
end;
Mustan sukupolvi ja alusvärien poisto kuuluvat samaan perheeseen. Kun laite muuntaa RGB:n CMYK:ksi, se päättää kuinka suuri osa harmaasta komponentista siirretään mustana musteena, ja eritelmä ilmaisee tämän päätöksen funktiona, graafisen tilan sanakirjan /BG2- ja /UCR2-merkinnöinä, joista kukin sisältää yhden tulokäyrän lasketusta harmaasta mustaan. Ne ovat myös tyypin 0 funktioita silloin, kun haluat mitatun käyrän analyyttisen käyrän sijaan. Ne on rakennettu samalla tavalla komennon RegisterSampledFunction kautta ja sijoitettu grafiikkatilaan. Säilytettävän arvoinen oppitunti on, että PDF-toiminto ei ole koskaan se paikka, jossa värinhallinta tapahtuu; se on hakutaulukko, joka sisältää tekemäsi päätöksen todellisella värimoottorilla, ja tyyppi 0 on ainoa toimintotyyppi, joka on tarpeeksi joustava kaiken päätöksenteon mahdollistamiseksi
Saat laajemman kuvan fonttien, kuvien ja väriresurssien tulostamisesta valmiiseen asiakirjaan katsomalla raportin esittelyämme, jossa on fontteja ja kuvia. Kun tulosteen on selviydyttävä arkistoinnista tai tulostuksen esitarkastuksesta, PDF/A-, PDF/X- ja PDF/UA-vahvistusoppaassa käsitellyt väriavaruus- ja tulostustavoitesäännöt säätelevät mitä näistä toiminnoista sallitaan ja miten laitteen värit on merkittävä. Kaikki nämä toimitetaan Delphin ja C++Builderin HotPDF Component -osassa varjostus-, ICC- ja erottelusovellusliittymien ohella, jotka rakentuvat samalle Type 0 -ytimelle