(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]
参照: