(Application) DCLのPSのbitmapの色変換
作成者:大塚 成徳
概要
dclpsrgb2cmykでは線の色をRGBからCMYKに変換することはできますが、 ビットマップ部分の色を変更する事はできません。 以下のプログラムはビットマップ部分をCMYKもしくはグレースケールにします。 ruby及びNArrayが必要です。
(2014-7-16) ruby 1.9 以降に対応しました。
(2008-6-13) バグがあったので修正しました。
使い方
このプログラムは標準入力から読み込んで標準出力に書き出します。
$ dclpsimgrgb2cmyk dcl.ps > new.ps
(注意)どうやらdclpsrotを通したものは受け付けないようです。 先にdclpsimgrgb2cmykを通してから他の処理を行ってください。
ソースコード
dclpsimgrgb2cmyk
#!/usr/bin/env ruby
require "narray"
while (gets)
if $_ =~ /\/picstr/
imgwidth = $_.split[1].to_i
puts $_
elsif $_ =~ /colorimage/
break if $`.split[-1].to_i != 3 # IF NOT RGB
puts $`.split[0] << " 4 colorimage"
buf = ""
i = 0
last = false
while (gets)
if $_ =~ /grestore/
last = true
buf << $`
else
$_.chomp!
buf << $_
end
while buf.size >= imgwidth * 2 * 3
tmp = NArray.to_na([buf[0...imgwidth*2*3]].pack("H*").unpack("C*"))
tmp = tmp.reshape!(3,imgwidth).to_type(NArray::LINT)
tmp.mul!(-1).add!(255)
k = tmp.min(0).to_type(NArray::BYTE)
tmp.sbt!(k.newdim(0))
tmp.mul!(k.ne(255).newdim(0))
tmp.mul!(255).div!((255-k+k.eq(255)).newdim(0))
tmp2 = NArray.byte(4,imgwidth)
tmp2[0..2,true] = tmp[]
tmp2[-1,true] = k[]
tmp2.reshape!(imgwidth*4)
tmp2.each{|c|
printf("%02x", c)
if (i+=1) == 32
puts
i=0
end
}
buf = buf[(imgwidth*2*3)..-1]
end
if last
puts if i != 0
puts "grestore" << $'
break
end
end
else
puts $_
end
end
dclpsimgrgb2gray
#!/usr/bin/env ruby
require "narray"
while (gets)
if $_ =~ /\/picstr/
imgwidth = $_.split[1].to_i
puts $_
elsif $_ =~ /colorimage/
break if $`.split[-1].to_i != 3 # IF NOT RGB
puts "image"
buf = ""
i = 0
last = false
while (gets)
if $_ =~ /grestore/
last = true
buf << $`
else
$_.chomp!
buf << $_
end
while buf.size >= imgwidth * 2 * 3
tmp = NArray.to_na([buf[0...imgwidth*2*3]].pack("H*").unpack("C*"))
tmp = tmp.reshape!(3,imgwidth).mean(0).to_type(NArray::BYTE)
tmp.each{|c|
printf("%02x", c)
if (i+=1) == 32
puts
i=0
end
}
buf = buf[(imgwidth*2*3)..-1]
end
if last
puts if i != 0
puts "grestore" << $'
break
end
end
else
puts $_
end
end
キーワード:[Postscript] [CMYK]
参照: