やりたいこと
前回まででPGM形式の画像の出力、読み込みができるようになったから、
今度は画像処理をやってみる。
今回は一番簡単な、反転画像を作る。
プログラム
だいたいこんな感じ。
import System.IO
import System.Environment (getArgs)
main = do
args <- getArgs
if length args <= 1 then do
print "usage : ./pgm-input input.pgm output.pgm"
else do
infile <- openFile (head args) ReadMode
-- Read PGM Header
pgm_type <- hGetLine infile
pgm_comment <- hGetLine infile
pgm_max_brightness <- hGetLine infile
pgm_size <- hGetLine infile
-- Read PGM Pixels-
pixels_handle <- hGetContents infile
let src_contents = take (length pixels_handle) $ pixels_handle
let src_contents_lines = lines src_contents
let src_pixels = concat (map (\x -> words x) src_contents_lines)
let int_pixels = map (\x -> read x::Int) src_pixels
let dist_pixels = map (\x -> 255 - x) int_pixels
-- Output PGM File
fh <- openFile (args !! 1) WriteMode
hPutStrLn fh pgm_type
hPutStrLn fh pgm_comment
hPutStrLn fh pgm_max_brightness
hPutStrLn fh pgm_size
hPutStr fh ((foldr (\x xs -> show(x) ++ " " ++ xs ) "") dist_pixels)
hClose infile
hClose fh
結果
入力画像
出力画像
うん。うまくいってる。