読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

haskellでppmファイルをネガポジ変換

まぁ目も当てられないHaskellコーディングです。
自分がHaskellわかっていないことを晒していますね(^^;;。

画像フォーマットのデータ構造をデータ型として表現すべきなのはもちろんですが。。

  1 import System.Environment
  2 import qualified Data.ByteString.Lazy as BL
  3 import qualified Data.List as DL
  4 import System.IO
  5 import Data.Word
  6 import Data.Binary
  7 import Data.Binary.Get
  8 import Data.Binary.Put
  9 
 10 listOfWord8 :: Get [Word8]
 11 listOfWord8 = do
 12   empty <- isEmpty
 13   if empty
 14      then return []
 15      else do v <- getWord8
 16              rest <- listOfWord8
 17              return (v : rest)
 18   
 19 main :: IO ()
 20 main = do 
 21   args <- getArgs
 22   let infile  = args !! 0
 23   let outfile = args !! 1 
 24   input <- openBinaryFile infile  ReadMode >>= BL.hGetContents
 25   let imageData = runGet listOfWord8 input
 26   
 27   let [i0,i1,i2] = take 3 $ DL.findIndices (λz -> z == 10) imageData
 28   let magicword  = take (i0)      imageData
 29   let imageData1 = drop (i0+1)    imageData
 30   let size       = take (i1-i0-1) imageData1
 31   let imageData2 = drop (i1+1)    imageData
 32   let colorNum   = take (i2-i1-1) imageData2
 33   let imageData3 = drop (i2+1)    imageData
 34 -- debug
 35   print $ length imageData
 36   print [i0,i1,i2]
 37   print $ BL.pack magicword
 38   print $ BL.pack size
 39   print $ BL.pack colorNum
 40   print $ take 3 imageData3
 41 --
 42 -- processing
 43 --
 44   let imageData_out = map (λx -> 255 - x) imageData3
 45 --
 46 -- write
 47 --
 48   whandle <- openFile outfile  WriteMode
 49   BL.hPut whandle $ runPut $ mapM_ putWord8 $ (magicword ++ [10] ++ size ++ [10] ++ colorNum ++ [10] ++ imageData_out)
 50   hClose whandle
[test-user]$ runghc ./sample03.hs ./girl.ppm ./girl_out2.ppm

変換前
f:id:naotoogawa:20140421210035p:plain

変換後
f:id:naotoogawa:20140421210030p:plain

元画像は下記を使わせていただきました。
http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=sample_pnm