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
変換前
変換後
元画像は下記を使わせていただきました。
http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=sample_pnm