1 0 0 rg ile, saf kırmızıyla dolgulanmış bir başlık, gri dönüşümünden 0.299 g olarak döner. Saf mavi 0.114 g'a düşer; lacivert bir logo ile gövde metninin ayırt edilmesini zorlaştıracak kadar siyaha yakındır. O sayılar bir yuvarlama kazası değildir: BT.601 parlaklık ağırlıklarıdır; bir görüntüleyicinin RGB sayfayı gri bir aygıtta gösterirken uyguladığı ağırlıkların aynısıdır ve renkli bir broşürün grilemesi gerektiğinde ne kadar kontrastın hayatta kalacağına onlar karar verir
RecolorDocument her renk için neyi hesaplar
PDF Library for Delphi dönüşümü, TPDFlib üzerinde RecolorDocument(TargetSpace) olarak açar; gri için 1, RGB için 2 ve CMYK için 3. Dönüştürdüğü şeylerin sayısını döndürür; geometri, metin konumları ve görsel yerleşimi oldukları yerde kalır. Yalnızca renk değerleri ve etraflarındaki renk uzayı adları değişir
Her renk, hedefe giderken RGB'den geçer. Gri, parlaklık toplamı 0.299 R + 0.587 G + 0.114 B'dir. CMYK, ISO 32000-1 §10.3'ün düz aygıt kuralıyla RGB'ye ulaşır: her kanal, bir eksi kendi mürekkebi ile siyahının toplamıdır ve sıfıra sabitlenir. RGB, en büyük bileşeni siyaha çekerek CMYK'ya ulaşır: K = 1 - max(R, G, B), kalan mürekkepler artandan ölçeklenir. Yazıcıya bir şey göndermeden önce bilinmesinde fayda olan birkaç sonuç:
0.4 ggri, CMYK'ya dönüştürüldüğünde0 0 0 0.6 kolur; yalnızca siyah mürekkep, baskının metin ve cetveller için istediği de budur- RGB
1 0.5 0(turuncu),0 0.5 1 0 kolur; hiç siyah içermez 0.6 0.4 0.4 1 kgibi zengin bir siyah, griye giderken0 golur; fazladan mürekkepler sade bir şekilde kaybolur- Saf camgöbeği,
1 0 0 0 k,0.701 g'e döner; doygun bir mürekkepten çoğu insanın beklediğinden daha açıktır
Dönüştürülen işlenenler, işi çalıştıran makinenin yerel ayarı ne olursa olsun en fazla üç ondalık basamakla ve ondalık ayracı olarak daima noktayla yazılır. ISO 32000-1 §7.3.3 bir içerik akışında başka hiçbir şeye izin vermez; sayıları sistem yerel ayarıyla biçimlendiren bir dönüştürücü, Alman bir iş istasyonunda 0,5 g yazar; bir okuyucu bunu, 0 sayısı ve ardından gelen bilinmeyen bir işleç olarak ayrıştırır
var
Lib: TPDFlib;
Converted: Integer;
begin
Lib := TPDFlib.Create;
try
if Lib.LoadFromFile('brochure.pdf', '') <> 1 then
raise Exception.Create('Could not open brochure.pdf');
Converted := Lib.RecolorDocument(1); // 1 = gri, 2 = RGB, 3 = CMYK
WriteLn(Format('%d colors, images and gradients converted', [Converted]));
Lib.SaveToFile('brochure-gray.pdf');
finally
Lib.Free;
end;
end;
Renkleri hedef uzayda zaten olan bir sayfa, özgün içerik baytlarını korur. RecolorDocument yalnızca bir uzaydan diğerine gerçekten geçen dönüşümleri sayar; dolayısıyla hâlihazırda gri olan bir belge 0 bildirir ve içinde hiçbir şey yeniden yazılmaz. Büyük bir dosyada bu önemlidir: girdi ile çıktının diff'i, tam olarak hangi sayfaların değiştiğini gösterir
RecolorPage kapak fotoğrafını neden renkli bırakır?
RecolorPage, seçili sayfadaki renk işleçlerini dönüştürür ve orada durur. Görseller ile gradyanlar belge düzeyi nesnelerdir, çoğu zaman birkaç sayfa tarafından paylaşılır ve yalnızca RecolorDocument onları dönüştürür. Bu yüzden yalnızca kapağı dönüştürmenin bariz yolu, 1. sayfayı seçip RecolorPage(3) çağırmak, size bir RGB fotoğrafın üstünde CMYK başlıklar ve cetveller verir
O bölme kasıtlıdır. Kapakta çizilen bir image XObject, 12. sayfada da çiziliyor olabilir; onu bir sayfa için dönüştürmek her ikisi için de dönüştürmektir. Paylaşılan kaynaklara sessizce uzanan sayfa kapsamlı bir çağrı, çağıranın hiç seçmediği sayfaları değiştirirdi. İkisinin içinde daha kötü sürpriz odur; bu yüzden sayfa başına çağrı yalnızca sayfaya ait olana dokunur
// Yalnızca kaptaki işleçler; görseller ve gradyanlar burada dönüştürülmez
Lib.SelectPage(1);
Changed := Lib.RecolorPage(3);
if Changed = 0 then
WriteLn('Cover already uses CMYK operators (or the target was out of range)');
Lib.SaveToFile('cover-cmyk-operators.pdf');
// Baştan sona tek uzay olması gereken bir belge için tamamını dönüştürün
Lib.RecolorDocument(3);
Lib.SaveToFile('all-cmyk.pdf');
O parçadaki dönüş değerine dikkat edin. İki çağrı da 1 ile 3 dışındaki bir hedef için 0 döndürür ve 0, değişiklik gerekmeyen bir sayfanın cevabıdır; dolayısıyla hedefteki bir yazım hatası, hâlihazırda doğru olan bir belgeyle tam olarak aynı görünür. Bağımsız değişkeni çağrıdan önce kendiniz doğrulayın. RecolorDocument, çalışmadan önce seçili olan sayfayı geri getirir; yani sayfa sayfa ilerleyen bir işin ortasında, sonrasında yeniden seçme derdi olmadan çağırabilirsiniz
Bir kapsam ayrıntısı daha. İşleç geçişi her sayfanın kendi içerik akışını, yani sayfanın kendisinde listelenen çizim talimatlarını okur ve g, rg, k, bunların kontur biçimlerini ve geçerli uzay bir aygıt uzayıyken sc / scn'yi dönüştürür. Dönüştürülen bir sc'den önce /DeviceRGB cs geliyorsa uzay adı da hedefe yeniden yazılır. Elle yazılmış bir dönüştürücüde o yeniden adlandırmayı atlarsanız okuyucu, tek bir gri değerin durduğu yerde üç RGB bileşeni arayarak kalır
Görseller ve paletler: hangileri değişir, hangileri baytlarını korur
Görseller, işleçler kadar önem taşır. Yalnızca işleçleri işlenmiş grile çevrilmiş bir broşür, gri sayfalarda hâlâ renkli fotoğraflar gösterir; bu, ne özgün hâline ne de tam bir dönüşüme göre iyi okunur. RecolorDocument, bir görsel bileşen başına sekiz bit, bir aygıt renk uzayı ve ya hiç sıkıştırma ya da decode parametresi olmayan düz Flate taşıdığında onu dönüştürür
İndeksli görseller başka bir yol izler. Örnekleri bir renk tablosuna indekstir; tablo dönüştürülür ve her örnek hâlihazırda sahip olduğu indeksi korur. 256 renkli palet görseli olarak kaydedilmiş bir ekran görüntüsü ya da grafik, örnekleri nasıl paketlenmiş veya sıkıştırılmış olursa olsun bu yolla dönüştürülür; çünkü örnekler asla çözülmez. Paletin tabanı bir aygıt uzayı olmalıdır; bir ICC profili üzerinden kurulu palet tablosunu korur
Bir JPEG ya da faks ile kodlanmış görsel baytlarını korur. Renklerini değiştirmek, onu çözmek, dönüştürmek ve yeniden sıkıştırmak demektir; bu ikinci bir nesil JPEG bozulması ekler ve dosya boyutunu kimsenin istemediği biçimlerde değiştirir. Bir iş gerçekten her fotoğrafı gri istiyorsa yeniden kodlama, kendine özgü kalite ayarı olan ayrı bir karardır; rengi dönüştüren bir geçişin bu kararı çağıran adına vermesinden iyidir, çağıranın onu açıkça vermesi
Yumuşak maskeler ve şablon maskeler başka bir nedenle olduğu gibi kalır. Bir yumuşak maske genellikle bir DeviceGray görselidir ama değerleri kapsamı ifade eder. Birini üç bileşenli RGB'ye çevirirseniz görüntüleyici onu saydamlık olarak ele almayı bırakır; sonuç, şekillendirmesi gereken içeriğin üstüne gri sanat eseri olarak boyanmış bir maskedir. RecolorDocument, herhangi bir görseli dönüştürmeden önce /SMask ya da /Mask üzerinden referans verilen her nesneyi toplar ve /ImageMask true taşıyan bir görselin baştan dönüştürecek rengi yoktur
İşleç düzeyinde ICCBased, Separation, Indexed ya da Pattern uzayları üzerinden ayarlanan renkler de yazıldıkları gibi bırakılır. Bir spot rengi ya da profille etiketlenmiş bir değeri, profili okumadan aygıt grisine çevirmek sayfanın görünüşünü değiştirir ve görevi görünüşü korumak olan bir geçiş, bir profilin ne kastettiğini tahmin etmeye başlayamaz
Gradyanlar: renk uzayı ile duraklar birlikte taşınır
Bir shading, renk uzayını bir kez bildirir ve her durağı bir işleve devreder. İşlev hâlâ üç sayı döndürürken /ColorSpace'i DeviceRGB'den DeviceGray'e yeniden adlandırın; bir okuyucu bunların ilkini, yani kırmızı kanalı, gri düzey sayar. Maviden beyaza bir gradyan o zaman siyahtan başlayan bir bant olarak işlenir. RecolorDocument önce tüm işlev ağacını salt okunur gezinir ve içindeki her düğüm dönüştürülebilir olmadıkça hiçbir şey dönüştürmez; ancak o zaman durakları yeniden yazar ve uzayı yeniden adlandırır
Yeniden yazdığı işlevler, iki uç rengi /C0 ile /C1 düz diziler olan üstel tip ve bunlardan kurulan birleştirme (stitching) işlevleridir. Bir /Background rengi gerisiyle birlikte dönüştürülür. Örneklenmiş bir tabloyla ya da bir PostScript programıyla tanımlı bir shading tanımını korur; renkleri bir işlev yerine bir akışın içinde saklayan 4-7 mesh tipleri de öyle. İkisini yeniden yazmak yeniden üretimdir; bir rengi dönüştürmekten farklı bir iştir
Gradyanları bulmak kendi başına bir tuzaktır. Tasarım araçları bir shading'e nadiren kendi nesnesini verir; genellikle onu boyayan pattern sözlüğünün içinde ya da bir sayfanın /Shading kaynaklarının içinde satır arası durur. Gradyan geçişini kurduğumuzda, üst düzey nesnelerin taraması neredeyse hiçbirini bulamamıştı. Arama artık nesne grafiğini izler; on iki derinlikle sınırlıdır ve her nesne numarasını bir kez ziyaret eder, böylece her sayfanın paylaştığı bir kaynak bir kez dönüştürülür ve bir nesneyi kendisine gösteren bir dosya döngüye giremez
Baskıya göndermeden önce yeniden renklendirmenin yeri
RecolorDocument'i normalleştirme olarak ele alın. Aygıt uzayları arasında değerleri dönüştürür; bir ICC profili uygulamaz, bir rendering intent'e uymaz ya da bir baskı koşulunu simüle etmez. Bir sözleşme provarına uyması gereken bir iş için doğru araç profilli bir iş akışıdır ve yeniden renklendirme geçişi, o iş akışı çalışmadan önce her şeyi tek uzaya sokan adımdan fazlası değildir
Asıl işini günlük üretim senaryosunda görür: grileşmesi gereken ama RGB bir logoyla gelen bir gönderim, renkli basılmaması gereken bir iç rapor, her dosya tek uzay kullanana dek bir preflight adımının reddedeceği bir toplu iş. Kurumdan çıkan her şey RecolorDocument'ten geçmeli, asla yalnızca RecolorPage'den değil; yarım dönüştürülmüş bir dosya hızlı bir görsel kontrolü geçer, sonra yazıcıda başarısız olur. Kararı aynı işte alın: PDF/A ve PDF/UA preflight ile uyumluluk ve imza atölyesi notları nasıl yapıldığını gösterir
// IsValidRecolorTarget sizin ekleyeceğiniz bir yardımcıdır; kütüphanede böyle bir çağrı yok
function IsValidRecolorTarget(Space: Integer): Boolean;
begin
Result := (Space >= 1) and (Space <= 3);
end;
procedure NormalizeFile(const Src, Dst: string; Space: Integer);
var
Lib: TPDFlib;
begin
if not IsValidRecolorTarget(Space) then
raise EArgumentException.CreateFmt('Bad recolor target %d', [Space]);
Lib := TPDFlib.Create;
try
if Lib.LoadFromFile(Src, '') <> 1 then
raise Exception.CreateFmt('Could not open %s', [Src]);
if Lib.RecolorDocument(Space) = 0 then
WriteLn(Src, ': already in the target space, copied unchanged');
Lib.SaveToFile(Dst);
finally
Lib.Free;
end;
end;
Çıktı üzerinde koşabileceğiniz hızlı bir kontrol: gri dönüşümünden sonra dönüştürülmüş bir sayfanın içeriğini herhangi bir PDF inceleyicisinde açın. Sayfanın kendi içeriği artık hiçbir rg, RG, k ya da K işleci içermemelidir. Geçişi atlatan renk, yukarıdaki olgulardan gelir: bir JPEG, profille etiketli ya da spot bir renk, örneklenmiş ya da mesh bir gradyan ya da bir form XObject'in içinde çizilmiş bir sanat eseri; onun talimatları sayfa içeriğinde değil, kendilerine ait bir akışta yaşar
Vektör sanat eserini yalnızca dönüştürmek yerine aynı zamanda kendiniz kuruyorsanız, vektör grafikleri, shader'lar ve gradyanlar gezinmesi shading'lerin ve pattern'lerin baştan nasıl oluşturulduğunu gösterir; yukarıdaki gradyan kurallarını öngörmeyi kolaylaştırır
Renk geçişi süreç içinde çalışır: PDF Library for Delphi, Delphi, C++Builder ve Lazarus için doğal Pascal'dır; dolayısıyla gelen bir dosya yığınını normalleştirmek, sunucuda harici bir dönüştürücü ya da komut satırı aracı gerektirmez. PDF Library for Delphi ürün sayfası belge işleme API'sinin geri kalanını listeler