PDF Library for Delphi hyväksyy AVIF-, HEIF- ja JPEG XL -kuvat syötteenä metodin AddModernImageFromFile sekä sen virta- ja merkkijonomuunnelmien kautta, säilyttäen alfan, upotetun ICC-profiilin ja 16-bittiset kanavat matkalla PDF-kuvaobjektiin. Muodon tunnistus tapahtuu rajoitetulla maagisen luvun lukemisella, ja purkaminen kulkee korvattavan taustajärjestelmän kautta, joten mitään ulkoista ei kutsuta tiedostolle, joka ei todellisuudessa ole yksi näistä muodoista
Nämä muodot saapuivat dokumenttityönkulkuihin puhelinten kautta. iOS on tuottanut HEIC:iä oletuksena vuosia, Android-laitteet tuottavat AVIF:ia, ja kenttäteknikko, joka valokuvaa vaurioituneen osan, lähettää kuvan, jota vuonna 2015 rakennettu PDF-raporttigeneraattori ei pysty avaamaan lainkaan. Yleinen varapolku, purkaminen alustan bittikartan kautta, tuottaa luotettavasti 8-bittisen värin ja menettää matkalla alfan ja värjäysprofiilin
Mitä nykyaikainen kuvapolku säilyttää, minkä bittikarttamuunnos menettää?
Kolme asiaa, ja jokaisella on työnkulku, joka riippuu siitä. Alfa säilyy, millä on merkitystä logoille ja tuoteirroituksille, jotka sommitellaan sivusisällön päälle. ICC-profiili säilyy, millä on merkitystä kaikelle, mikä tullaan tulostamaan tai väriyhdistämään. Ja 16-bittiset kanavat säilyvät, millä on merkitystä lääketieteelliselle ja tieteelliselle kuvamateriaalille, jossa 8-bittinen kvantisointi tuhoaa juuri ne asteikot, joita varten kuva otettiin
Kuvan välittäminen alustan bittikartan kautta menettää kaikki kolme yhdessä vaiheessa, ja se tekee sen hiljaa: syntyvä PDF näyttää suunnilleen oikealta, eikä kukaan huomaa, ennen kuin painotalo kysyy, miksi yrityksen punainen on väärä. Asetusarvo 8 nykyaikaisissa kuvakutsuissa on lippu, joka pitää alfan, ICC:n ja 16-bittiset kanavat yhdessä, ja se on näiden kutsujen oletusarvo
Yhden lisääminen sivulle
Kutsu palauttaa kuvatunnisteen, joka sitten valitaan ja piirretään, tai piirretään ja vapautetaan yhdessä vaiheessa:
uses
PDFlibrary, PDFlibModernImage;
var
Lib: TPDFlib;
ImageID: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.NewDocument;
Lib.SetPageSize('A4');
Lib.NewPage;
// Options = 8 säilyttää alfan, ICC:n ja 16-bittiset kanavat
ImageID := Lib.AddModernImageFromFile('site-photo.heic', 8);
if ImageID > 0 then
Lib.DrawImageAndRelease(ImageID, 40, 40, 515, 340)
else
Lib.DrawText(40, 40, 'image could not be decoded');
Lib.SaveToFile('inspection-report.pdf');
finally
Lib.Free;
end;
end;
Tunnistus edeltää purkamista ja on tarkoituksella kapea. Kirjasto lukee rajoitetun otsikon, tunnistaa ISO-perusmediatiedostomuodon merkit, jotka tunnistavat AVIF:in ja HEIF:in, ja tunnistaa sekä JPEG XL:n raa'an että säiliömuotoisen allekirjoituksen, sitten palauttaa kutsujan virran sijainnin. Tuntematon tai naamioitu syöte ei koskaan saavuta ulkoista koodekkia, mikä estää uudelleennimetyn suoritettavan tiedoston antamisen purkajalle ikään kuin se olisi kuva
Missä purkaminen todella tapahtuu?
Nykyaikaiset kuvamuodot ovat suuria, monimutkaisia koodekkeja, ja yhden laittaminen PDF-kirjaston sisään olisi outo suunnitteluvalinta. Oletustaustajärjestelmä lataa dynaamisesti käyttöönotettavan MagickWand-moduulin prosessin sisällä ja etsii sitä dokumentoidussa järjestyksessä: nimenomaisesta tiedostosta tai hakemistosta, jonka asetat, ympäristömuuttujista, suoritettavan tiedoston hakemistosta ja järjestelmän hakupolusta
Sovellukset, jotka jo toimittavat purkajan tai jotka eivät saa ladata mitään ulkoista moduulia lainkaan, rekisteröivät sen sijaan oman takaisinkutsunsa. Sopimus on pieni: lue syötevirta, kirjoita PNG tulosvirtaan, kunnioita pyydettyä suuntausta:
function MyDecoder(InStream, OutPNG: TStream;
ImageFormat: TPDFlibModernImageFormat;
ApplyOrientation: Boolean): Boolean;
begin
// Pura InStream omalla koodekillasi ja kirjoita PNG-tavut OutPNG-virtaan
Result := DecodeWithBundledCodec(InStream, OutPNG,
ImageFormat, ApplyOrientation);
end;
begin
RegisterModernImageDecoderBackend(MyDecoder);
// ... lisää kuvia ...
ClearModernImageDecoderBackend; // takaisin oletustaustajärjestelmään
end;
Käyttöönotto saa yhden mukavuuden ja yhden tarkoituksellisen pidättyväisyyden. Jos koodekkihakemisto sisältää modules\coders-alihakemiston, kirjasto täyttää koodekin ympäristömuuttujat, joita tällainen asettelu tarvitsee, mutta vain silloin, kun isäntäsovellus ei ole jo asettanut niitä. Sovellus, jolla on oma ajonaikainen käyttöönottostrategiansa, säilyttää sen
Miksi PNG keskellä?
Sillan rakentaminen muistinsisäisen PNG:n kautta raakan pikselipuskurin sijaan näyttää ylimääräiseltä vaiheelta ja on itse asiassa halvin oikea vaihtoehto. PNG ilmaisee kaiken, minkä täytyy säilyä, alfan, väritypin, bittisyvyyden ja upotetun ICC-profiilin, ja kirjastolla on jo kypsä, hyvin testattu polku PNG:stä PDF-kuvaobjektiin oikeilla suodattimilla ja väriavaruudella. Sen uudelleenkäyttö tarkoittaa, että nykyaikaiset muodot perivät vuosien oikeellisuustyön sen sijaan, että ne saisivat rinnakkaisen toteutuksen
Silta on kokonaan muistissa, joten väliaikaistiedostoja ei luoda eikä siivousta tarvita kaatumisen yhteydessä. Yksi rypistys vaati nimenomaista käsittelyä: jotkin muunnokset pudottavat ICC-profiilin muotoa vaihdettaessa. Taustajärjestelmä siis kaappaa lähdeprofiilin ennen muodon vaihtoa, pakkaa sen Flatella, rakentaa kelvollisen iCCP-lohkon uudelleenlasketulla CRC:llä ja poistaa mahdollisen sRGB-lohkon, joka olisi ristiriidassa sen kanssa. Testauksessa purettu AVIF säilytti 16-bittisen RGBA:n 16-bittisellä alfalla, ja tuloksena syntyneestä PDF:stä poimittu profiili täsmäsi lähdeprofiiliin tavu tavulta 60 960 tavun kokoisena
Käytännön huomioita ennen tuotantoon ottamista
Tarkista käytettävyys käynnistyksessä ensimmäisen valokuvan sijaan. ModernImageCodecAvailable raportoi, voiko taustajärjestelmää käyttää, ja SetModernImageCodecLibrary osoittaa nimenomaiseen tiedostoon tai hakemistoon, kun käyttöönottosi sijoittaa koodekin johonkin epästandardiin paikkaan:
Lib.SetModernImageCodecLibrary('C:\MyApp\codecs');
if Lib.ModernImageCodecAvailable = 0 then
Log('modern image input unavailable - HEIC and AVIF will be refused');
Tarkkaile tuloksen tiedostokokoa. 16-bittinen RGBA-kuva upotetulla profiililla on suuri PDF-kuvaobjekti, ja raportti, jossa on neljäkymmentä niitä, on suuri. Kun dokumentti on tarkoitettu näytöltä katseluun tulostuksen sijaan, alaspäin näytteistäminen ennen upottamista on oikea kompromissi, ja yleiset kokovivut käsitellään artikkelissa PDF-tiedostokoon optimointi
Lopuksi, päätä värikäytäntö harkitusti. Lähdeprofiilin säilyttäminen on oikein arkistointi- ja painotyölle; muuntaminen dokumentinlaajuiseen avaruuteen on oikein, kun sekalaisen valokuvajoukon täytyy näyttää yhtenäiseltä, ja muunnosreitti kuvataan artikkelissa dokumentin uudelleenväritys toiseen väriavaruuteen. Jos sinun täytyy vahvistaa, mitä tiedostoon todella päätyi, tarkastuspolku artikkelissa tekstin, kuvien ja fonttien poiminta raportoi dokumentin kantamat kuvaobjektit
Nykyaikainen kuvasyöte, värienhallinta ja kuvien optimointi ovat osa samaa kirjastoa Delphille, C++Builderille ja Free Pascalille; täydellinen ominaisuusluettelo on sivulla PDF Library for Delphi -sivulla