Printing 使用maskdict在postscript中进行图像掩蔽

Printing 使用maskdict在postscript中进行图像掩蔽,printing,postscript,printers,Printing,Postscript,Printers,我是后记新手,请耐心听我说。 我试图用maskdict屏蔽一幅图像,这样当我把这幅图像放在“showpage”之前时,我就可以创建一个混合水印效果。我在postscript中提到了解更多有关此功能的信息。不幸的是,我无法想出一个简单的工作示例 如果我能得到一个简单的工作示例,使用“ImageType 3和InterleaveType 3”以及maskdict,这将非常有帮助,这样我就可以在此基础上进行构建 提前感谢。这里是一个例子。这是从/ghostpdl/lib/image-qa.ps中随Gh

我是后记新手,请耐心听我说。 我试图用maskdict屏蔽一幅图像,这样当我把这幅图像放在“showpage”之前时,我就可以创建一个混合水印效果。我在postscript中提到了解更多有关此功能的信息。不幸的是,我无法想出一个简单的工作示例

如果我能得到一个简单的工作示例,使用“ImageType 3和InterleaveType 3”以及maskdict,这将非常有帮助,这样我就可以在此基础上进行构建


提前感谢。

这里是一个例子。这是从/ghostpdl/lib/image-qa.ps中随Ghostscript分发的一组更完整的示例中提取出来的,其中包括对类型1、3和类型4图像的测试

这意味着它不是最简单的示例,但它应该足以让一个有能力的PostScript程序员理解或进一步简化

%!PS

/WidthRGB   83 def
/HeightRGB  89 def

/SX 036 def
/SY 037 def
/XA 060 def

%
% Procedure to generate test mask data
%
% WM and HM must be defined prior to invocation
%     MaskGen -
%
% The mask data is stored into a string named /MaskData
%
% The mask consists of a "target". Bits past width WM are
% filled with 1's to make sure that pad bits are ignored.
%
/MaskGen {
  /H8 HM 8 div def
  /X0 WM 2 div def
  /Y0 HM 2 div def
  /WB WM 7 add 8 div cvi def
  /MaskData WB HM mul string def
  /MB [ 128 64 32 16 8 4 2 1 ] def
  0 1 HM 1 sub {
    /Y exch def
    0 1 WB 1 sub {
      /B exch def   % byte within the row
      /C B Y WB mul add def
      /P 0 def
      0 1 7 {
        /b exch def % bit within the character
        /X b B 8 mul add def
        X WM lt
          { X Y eq
            X HM 1 sub Y sub eq or
            Y Y0 gt X X0 sub abs 2 le and or
            X X0 sub WM div dup mul Y Y0 sub HM div dup mul add sqrt 9 mul cvi 2 mod 1 eq or
          }
          { true }  % pad bits are always set
        ifelse
        % stack: true if pixel is set
        {
          MB b get P or /P exch def
        } if
      } for % Bits within a byte
      MaskData C P put
    } for % Bytes within the row
  } for % Rows in the mask
} bind def          % MaskGen

% -----------------------------------------------------------------------

% -----------------------------------------------------------------------
%
% Procedures for ImageMatrix creation
/IMLRTB { [ WD 0 0 HD neg 0 HD ] } def

% Procedure to generate image data
%
% WD and HD must be defined prior to invocation
%    { proc } ImageGen -
%
% The procedure is called once for each pixel
% Local definitions are R, G, B, X and Y

% Example: Generate RGB Chunky pixel data (single data source) BPC = 8
%       /WD WidthRGB def
%       /HD HeightRGB def
%       /RGBData WD HD mul 3 mul string def
%   { X Y WD mul add 3 mul RGBData
%     dup 2 index R 255 mul cvi put
%     dup 2 index 1 add G 255 mul cvi put
%     exch 2 add B 255 mul cvi put
%   } ImageGen

/ImageGen {
  gsave
  0 1 HD 1 sub {
    /Y exch def
    0 1 WD 1 sub {
      /X exch def
      /D X WD 2 div sub WD div dup mul Y HD 2 div sub HD div dup mul add sqrt def
      /D D .6 div def
      /A X WD 2 div sub Y HD 2 div sub atan 360 div def
      A                               % Hue
      .7 D .3 sub .60 div sub  % Saturation
      dup 0.05 lt
        { .95 D .8 sub 3 mul sub 3 mul cvi 3 div sqrt } % Level once Saturation < 0
        { .7 D .25 sub .75 div add }  % Level inside
      ifelse
      X WD 2 div gt Y HD 2 div sub abs 2 le and { pop 0 } if   % asymmetric marker
      sethsbcolor
      currentrgbcolor /B exch def /G exch def /R exch def
      dup exec
    } for
  } for
  pop       % discard the procedure
  grestore
} bind def

% -----------------------------------------------------------------------
%
%     Procedures to use generated string data as procedure or files

/WD WidthRGB def
/HD HeightRGB def

/sM WidthRGB 2 mul 1 sub string def % long enough to hold more than one mask line
/sD WidthRGB 7 mul 1 sub string def % long enough to hold more than one 12 bit RGB line
                                % worst case is 12bit ImageType3 InterleaveType 1 == 48 bits

/MaskDProc {
  /FM MaskData dup length () /SubFileDecode filter def
  { { FM sM readstring pop } }
} bind def

/MaskDFile {
  MaskData dup length () /SubFileDecode filter
  /MDF 1 index def
} bind def

/RGBDProc {
  /FD RGBData dup length () /SubFileDecode filter def
  { { FD sD readstring pop } }
} bind def

/RGBDFile {
  RGBData dup length () /SubFileDecode filter
  /RGBDF 1 index def
} bind def

% YY, SX, SY, W, HD (Data) WM, HM (Mask) should be defined prior to invocation
%                                                   (IT is InterleaveType)
% X Y BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
%
/DoImage3 {
  gsave
  /DeviceRGB setcolorspace
  /IT exch def
  /DD exch def
  /DM exch def
  /MS exch def
  /S exch def       % May be an array of sources - For InterleaveType 3
                        % S[0] is the Mask DataSource
  /M exch def
  /BPC exch def
  /XX 1 index def
  YY translate SX SY scale
  0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke

  /DataImage
  <<
  /ImageType        1
  /Width        WD
  /Height       HD
  /ImageMatrix      M
  /MultipleDataSources  MS
  /DataSource       IT 3 ne { S } { S 1 get exec } ifelse
  /BitsPerComponent BPC
  /Decode       DD
  >>
  def
  /MaskImage
  <<
  /ImageType        1
  /Width        WM
  /Height       HM
  /ImageMatrix      % construct the mask matrix using signs from the DataImage matrix
                        /M0 M 0 get WD abs div cvi def
                        /M3 M 3 get HD abs div cvi def
                        /M4 M 4 get WD abs div cvi def
                        /M5 M 5 get HD abs div cvi def
                        [ WM M0 mul 0 0 HM M3 mul WM M4 mul HM M5 mul ]
  IT 3 eq {
    /DataSource     S 0 get exec    % DataSource only allowed for InterleaveType 3
  } if
  /BitsPerComponent IT 1 eq { BPC } { 1 } ifelse
  /Decode       DM
  >>
  def
  <<
  /ImageType        3
  /DataDict     DataImage
  /MaskDict     MaskImage
  /InterleaveType   IT
  >>
  image
  grestore
} bind def

% ----------------------------------------------------------------------
%       InterleaveType 3, BPC==8, WM=WD, HM=HD
%       IT 3 is line interleave -- Mask and Data in separate sources
%       RGB Image Data chunky (MultipleDatasources==false).
  /YY 50 def

  % Generate the MaskData first
  /WM WD def
  /HM HD def
  MaskGen

  % Generate the Data Image
  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen

   50  8  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [1 0 1 0 1 0]  3 DoImage3

% ----------------------------------------------------------------------

showpage
%!附言
/宽度RGB 83 def
/高度RGB 89 def
/SX 036 def
/SY 037 def
/XA 060 def
%
%生成测试掩码数据的步骤
%
%WM和HM必须在调用之前定义
%面具-
%
%掩码数据存储在名为/MaskData的字符串中
%
%遮罩由一个“目标”组成。超过宽度WM的位是
%填充1以确保忽略焊盘位。
%
/面具{
/H8 HM 8分区def
/X0 WM 2分区def
/Y0 HM 2分区def
/WB WM 7添加8分区cvi def
/MaskData WB HM多字符串定义
/MB[128 64 32 16 8 4 2 1]def
0 1 HM 1接头{
/Y exch def
0 1 WB 1子系统{
/B exch def%行中的字节
/C B Y WB mul添加def
/p0def
0 1 7 {
/b字符中的exch def%位
/X b 8多个添加def
X-WM-lt
{X Y eq
X HM 1子模块Y子模块均衡器或
Y Y0 gt X X0子abs 2 le和或
X X0子WM div dup mul Y Y0子HM div dup mul添加sqrt 9 mul cvi 2 mod 1 eq或
}
{true}始终设置%pad位
如果有
%堆栈:如果设置了像素,则为真
{
MB b获取P或P exch def
}如果
}对于字节内的%位
maskdatacpput
}对于行中的%Bytes
}对于掩码中的%行
}绑定定义%MaskGen
% -----------------------------------------------------------------------
% -----------------------------------------------------------------------
%
%ImageMatrix创建过程
/IMLRTB{[WD 0 HD neg 0 HD]}def
%生成图像数据的过程
%
%必须在调用之前定义WD和HD
%{proc}ImageGen-
%
%该过程对每个像素调用一次
%局部定义为R、G、B、X和Y
%示例:生成RGB块状像素数据(单个数据源)BPC=8
%/WD宽度RGB def
%/HD高度RGB def
%/RGBData WD HD mul 3 mul字符串定义
%{X Y WD mul添加3 mul RGB数据
%dup 2索引R 255多个cvi输出
%dup 2索引1添加G 255 mul cvi put
%exch 2添加B 255多个cvi put
%}ImageGen
/ImageGen{
gsave
01高清1分{
/Y exch def
0 1 WD 1接头{
/X exch def
/D X WD 2 div sub WD div dup mul Y HD 2 div sub HD div dup mul add sqrt def
/D.6分区def
/X WD 2分区接头Y HD 2分区接头或360分区def
百分之一色调
.7 D.3低于60 div低于%饱和度
dup 0.05 lt
{.95 D.8 sub 3 mul sub 3 mul cvi 3 div sqrt}一旦饱和<0
{.7 D.25 sub.75 div add}%内部级别
如果有
X WD 2 div gt Y HD 2 div sub abs 2 le和{pop 0}如果%不对称标记
色
当前RGB颜色/B exch def/G exch def/R exch def
dup执行
}为了
}为了
pop%放弃该过程
格雷斯托
}绑定def
% -----------------------------------------------------------------------
%
%将生成的字符串数据用作过程或文件的过程
/WD宽度RGB def
/高清高度RGB def
/sM WidthRGB 2 mul 1子字符串定义%长度足以容纳多条屏蔽线
/sD WidthRGB 7 mul 1子字符串定义%长度足以容纳多条12位RGB线
%最坏的情况是12位ImageType3交织类型1==48位
/MaskDProc{
/FM MaskData dup长度()/子文件解码筛选器定义
{{FM sM readstring pop}}
}绑定def
/MaskDFile{
MaskData dup length()/子文件解码筛选器
/MDF 1索引定义
}绑定def
/RGBDProc{
/FD RGBData dup length()/子文件解码过滤器def
{{FD sD readstring pop}}
}绑定def
/RGB文件{
RGBData dup length()/子文件解码过滤器
/RGBDF 1索引定义
}绑定def
%YY、SX、SY、W、HD(数据)WM、HM(掩码)应在调用之前定义
%(它是交错式的)
%X Y BPC矩阵源多MaskDecode数据解码它DoImage3-
%
/DoImage3{
gsave
/DeviceRGB集合颜色空间
/它是exch def
/DD exch def
/DM exch def
/戴夫女士
/S exch def%可能是源数组-用于交织类型3
%S[0]是掩码数据源
/M exch def
/BPC exch def
/XX 1索引定义
YY翻译SX SY量表
0设置线宽0 0移动到1 0线条到1 1线条到0 1线条到0 0线条到笔划
/数据图像
>
def
/伪装
>
def
>
形象
格雷斯托
}绑定def
% ----------------------------------------------------------------------
%交织类型3,BPC==8,WM=WD,HM=HD
%它是行交织——掩码和数据在不同的源中
%RGB图像数据块(MultipleDatasources==false)。
/YY 50 def
%首先生成MaskData
/WM WD def
/HM HD def
图片颜色转换
%生成数据图像
/RGBData WD HD mul 3 mul字符串定义
{X Y WD mul添加3 mul RGB数据
dup 2索引R 255多个cvi输出
dup 2索引1添加G 255 mul cvi put
exch 2添加B 255多个cvi put
}ImageGen
50 8 IMLRTB[MaskData RGBData]false[0 1][1 0 1 0]3 DoImage3
% ----------------------------------------------------------------------
展示页