バイナリPPMの出力

ousttrue2009-01-25

調べるのにすごい苦労してしまった。
[Word8]がByteStringであることはすぐにわかったのだが
Int->Word8の変換方法が見つからなくて難航。
たまたま検索でかかったコード辺からようやく判明した。
toEnumとするとInt->Word8にできるらしい。
リファレンスを見るのを覚えた。

import qualified Data.ByteString.Char8 as B
import System.IO

-- write raw data to file as PPM binary format.
writeP6::String->Int->Int->[RGB24]->IO()
writeP6 filepath width height rawdata=do
  handle<-openBinaryFile filepath WriteMode
  -- header
  B.hPut handle (B.pack 
    ("P6\n"
    ++(show width)++" "++(show height)++"\n"
    ++"255\n"))
  -- binary
  B.hPut handle $ B.pack $ map toEnum $ concatMap toList rawdata
  hClose handle

-- RGB24に追加
toList::RGB24->[Int]
toList (RGB24 r g b)=[r, g, b]