(Application) DCLのPSのbitmapの色変換

作成者:大塚 成徳

概要

dclpsrgb2cmykでは線の色をRGBからCMYKに変換することはできますが、 ビットマップ部分の色を変更する事はできません。 以下のプログラムはビットマップ部分をCMYKもしくはグレースケールにします。 ruby及びNArrayが必要です。

dclpsimgrgb2cmyk

dclpsimgrgb2gray

(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
更新日時:2014/07/16 11:16:36
キーワード:[Postscript] [CMYK]
参照: