Teknik Makale

Delphi'de Yumuşak Maskeler ve Saydamlık Düzleştirme

PDF Library for Delphi, Delphi'den her iki PDF yumuşak maske türünü de oluşturur. SetImageSoftMaskEx, bir maske görüntüsünü hedef bir görüntüye ekler ve önceden çarpılmış (pre-multiplied) görselin ihtiyaç duyduğu /Matte girdisini yazabilir. NewSoftMaskGraphicsState, yakalanan içerikten bir alfa veya parlaklık maskesi oluşturur ve sonraki çizime uyguladığınız bir grafik durumu döndürür. Ve bir tüketici saydamlığı hiç işleyemediğinde FlattenTransparency, görsel sonucu render eder ve her sayfayı onunla değiştirir

Yumuşak maskeler, PDF'nin bir gradyan solmasını, bir vinyeti, bir arka plana harmanlanmış bir fotoğrafı ve opaklığın bir bölge boyunca değiştiği diğer her efekti ifade etme yoludur. Sabit saydamlık, grafik durumundaki tek bir sayıdır; bir yumuşak maske ise konumun tam bir işlevidir ve bir tane oluşturabilene kadar tüm bir tasarım kategorisi yeniden üretilemez

İki Maske Türü ve Her Birinin Ne Okuduğu

Bir alfa maskesi değerlerini maskeleme içeriğinin alfa kanalından alır. Bir parlaklık maskesi bunları maskeleme içeriğinin parlaklığından alır, bu yüzden beyaz bir alan tam opak ve siyah bir alan tam saydamdır. Parlaklık, tasarımcıların başvurduğu türdür, çünkü bir gri tonlama gradyanı boyamak bir solmayı tanımlamanın doğal bir yoludur

Form yumuşak maskeleri, yakalanan içerikten oluşturulur ve birkaç ayrıntı isteğe bağlı değil sabittir. Yakalanan içerik, DeviceRGB'de izole bir saydamlık grubu haline gelir, bu yüzden maske bilinen bir renk uzayında değerlendirilir. Bu yüzden arka plan renginin, o grupla eşleşen üç bileşeni olmalıdır. Aktarım işlevi /Identity'yi veya geçerli bir işlev nesnesini kabul eder ve görseli yeniden boyamadan maske eğrisini yeniden şekillendirmenize izin verir

Parlaklık ve alfa yumuşak maskelerinin NewSoftMaskGraphicsState'i beslemesini karşılaştıran ve grafik durumunun temizlenene kadar kalıcı olduğunu hatırlatan diyagram
Parlaklık maskeleri parlaklığı okurken alfa maskeleri kaplamayı okur ve NewSoftMaskGraphicsState her ikisini de kalıcı bir grafik durumuna sarar
uses
  PDFlibrary;

var
  Lib: TPDFlib;
  MaskCapture, MaskGS, PhotoID: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('brochure.pdf', '');

    // Sayfa 4, maske olarak kullanılmak üzere boyanmış bir gri tonlama gradyanı içerir
    MaskCapture := Lib.CapturePage(4);

    MaskGS := Lib.NewSoftMaskGraphicsState(MaskCapture,
      PDF_SOFT_MASK_LUMINOSITY, '0 0 0', '/Identity');

    Lib.SelectPage(1);
    Lib.SetGraphicsState(MaskGS);
    PhotoID := Lib.AddImageFromFile('hero.jpg', 0);
    Lib.SelectImage(PhotoID);
    Lib.DrawImage(40, 700, 515, 260);        // maskenin altında solar

    // ExtGState ayarları kalıcıdır: kapsamı açıkça sonlandırın
    Lib.SetGraphicsState(Lib.NewSoftMaskGraphicsState(0,
      PDF_SOFT_MASK_NONE, '', ''));

    Lib.SaveToFile('brochure-masked.pdf');
  finally
    Lib.Free;
  end;
end;

Bu son adım süsleme değildir. Grafik durumu parametreleri değiştirilene kadar kalıcıdır ve sonrasında sıradan bir grafik durumu uygulamak etkin bir yumuşak maskeyi temizlemez. Açık bir /SMask /None olmadan, maskelenmiş görselden sonra çizilen her şey maskeyi devralır; bu, görsel olarak teşhis edilmesi en şaşırtıcı hatalardan biridir

Görüntü Maskeleri ve Matte Girdisi

Görüntü düzeyinde maskeleme için maske görüntüsü önce DeviceGray'e normalize edilir, bu yüzden herhangi bir renk uzayında sağlanan bir maske öngörülebilir şekilde davranır. Görüntünün renk uzayına bağlı olarak bir ila dört bileşenli isteğe bağlı /Matte girdisi, bir tüketiciye görüntü verisinin o renge karşı önceden çarpıldığını söyler; bu, önceden çarpılmış bir görselin düz alfaymış gibi bileştirilmesinde ortaya çıkan koyu haleyi önler

Eksik bir Matte girdisinin koyu haleler ürettiğini, bildirilen bir Matte'nin ise temiz bir şekilde bileştiğini, yanında PDF 1.4 ve PDF/A ve PDF/X korkuluklarını gösteren diyagram
Bildirilen bir /Matte, önceden çarpılmış görselin koyu halesini önlerken PDF/A-1 ve PDF/X-1 dosyaları herhangi bir nesne değişmeden önce reddedilir

Burada iki korkuluk önemlidir. PDF/A-1 ve PDF/X-1 saydamlığı yasaklar ve çağrı, daha sonra doğrulamada başarısız olan bir dosya üretmek yerine herhangi bir nesneyi değiştirmeden önce reddeder. Ve başarılı bir yumuşak maske, kitaplığın otomatik olarak ayarladığı PDF 1.4'ü gerektirir — saydamlık bu sürümden önce yoktu ve yumuşak maskeler içeren bir dosyada 1.3 başlığı basitçe yanlıştır

Tekrarlanan durumlar yeniden kullanılır: aynı yakalanan form, maske türü, arka plan ve aktarım işlevi imzası, çağrı başına yeni bir nesne yerine aynı grafik durumu nesnesini verir. Yüz görüntüyü aynı şekilde maskeleyen bir belgede bu, hiç yazılmayan doksan dokuz nesne demektir

Neden Düzleştirmeli ve Düzleştirme Gerçekte Ne Yapar

Saydamlık hâlâ "ekranda doğru görünüyor, baskıda yanlış görünüyor" durumunun en yaygın kaynağıdır. Daha eski RIP'ler, bazı düzenleyici gönderim sistemleri ve PDF/X-1a'nın hepsi, hiç canlı saydamlık içermeyen bir dosya gerektirir

Buradaki düzleştirme kasıtlı olarak gerçektir: istenen aralıktaki her sayfa, opak bir arka plana karşı seçilen bir DPI'de render edilir ve sayfa içeriği ve kaynakları o tek görüntüyle değiştirilir. Render motoru nihai bileştirilmiş sonucu ürettiğinden bu, her şeyi bir kerede kapsar — saydamlık grupları, harmanlama modları, yumuşak maskeler, desenler ve iç içe geçmiş formlar — yanlış yapılabilecek yapı başına bir yaklaşıklık mantığı olmadan. Tepe raster bellek tek bir sayfayla sınırlı kalır

FlattenTransparency'nin istenen her sayfayı opak bir arka plan üzerinde 300 DPI'de render ettiğini ve düz, baskıya hazır bir PDF 1.3 dosyası kaydettiğini gösteren boru hattı diyagramı
İstenen her sayfa, seçilen DPI'de bir kez render edilir ve doğru bir PDF 1.3 dosyasına kaydedilen tek bir opak görüntü olarak döner
// 1-8. sayfaları beyaz üzerinde 300 DPI'de düzleştir, ardından PDF 1.3 olarak kaydet
Lib.FlattenTransparency('1-8', 300, $FFFFFF, 0);
Lib.SaveToFile('press-ready.pdf');

Ödünleşim de aynı derecede gerçektir: çıktı bir görüntüdür, bu yüzden metin artık seçilebilir veya aranabilir değildir ve vektör kenarları seçilen DPI'de yeniden örneklenir. Düzleştirme bir teslimat adımıdır, bir düzenleme adımı değildir. Saydam özgünü saklayın ve bir kopyayı düzleştirin

Döndürülmüş Sayfalar, Kullanıcı Birimleri ve Sayfa Kutuları

Döndürülmüş bir sayfa, naif bir uygulamanın atladığı özen ister. Render ettikten sonra görsel genişlik ve yükseklik MediaBox'a geri yazılır, kullanıcı birimi etkin DPI'ye ve yeni sayfa boyutuna katlanır ve /Rotate girdisi, kullanıcı birimi ve yardımcı sayfa kutuları kaldırılır

Bunu atlamak, düzleştirilmiş görüntünün doğru olduğu ama bir görüntüleyicinin onu yeniden döndürdüğü veya artık geçerli olmayan bir kullanıcı birimiyle ölçeklendirdiği bir dosya üretir. Kutuları yeniden hesaplamak yerine kaldırmak doğru karardır, çünkü düzleştirme öncesi geometriyi tanımlayan bir TrimBox, hiç TrimBox olmamasından daha kötüdür

Açıklamalar ve form alanları varsayılan olarak statik görüntüye render edilir ve etkileşimli nesneler kaldırılır; bir baskıya hazır teslimatın istediği şey budur. Bunun yerine etkileşimli nesneleri tutarsanız, hiçbir şeyin iki kez çizilmemesi için render motorunun açıklama geçişi kapatılır

Her Şeyi Tarayan Sürüm Kontrolü

PDF 1.3 olarak kaydetmek, hiçbir yerde saydamlık kalmamasını gerektirir ve kayıt öncesi kontrol, yalnızca sayfalardan erişilebilenleri değil her dolaylı nesneyi inceler. Bu, ilk göründüğünden daha katıdır ve doğrudur: önceki bir düzenlemenin arkasında bıraktığı öksüz bir yumuşak maske hâlâ dosyadadır ve sayfalar yerine nesneleri dolaşan bir tüketici onu bulur

Sürüm düşürmeyi başarılabilir kılmak için, her hedef sayfa başarıyla değiştirildikten sonra varsayılan olarak bir işaretle-ve-süpür geçişi çalışır ve erişilemeyen nesneleri serbest bırakır. Planlanması gereken sonuç, o süpürmeden önce alınan görüntü, yakalanan sayfa ve grafik durumu tanımlayıcılarının sonrasında artık geçerli olmayabileceğidir. Düzenlemeye devam etmeden önce ihtiyacınız olan kaynak tanımlayıcılarını yeniden alın, ya da süpürmeyi devre dışı bırakın ve sürümün o zaman düşürülemeyeceğini kabul edin

İki yoldaş resmi tamamlar. Maskeler yerine gölgelendirme ve gradyanlar kullanan vektör görseli, vektör grafikler, gölgelendiriciler ve gradyanlar başlığında ele alınmıştır ve efekt bir gölgelendirme olarak ifade edilebildiğinde genellikle daha iyi yoldur. Ve düzleştirmenizin nedeni bir saydamlık değil bir renk gereksinimiyse, bir belgeyi başka bir renk uzayına yeniden renklendirme başlığındaki dönüştürme yolu, düzleştirmenin koruyamayacağı canlı metni korur

Yumuşak maske oluşturma, düzleştirme ve arkalarındaki render motoru, Delphi, C++Builder ve Free Pascal için tek bir kitaplıkta gelir; eksiksiz özellik listesi PDF Library for Delphi sayfasında bulunur