Ketil Malde wrote:
I discovered that although XPM accepts values in the range 0x00..0xff, it is still monochrome. XGM (plain, that is, not raw) is approximately the same format, but displays the way I wanted. So I ended up using:
mkpgm :: Array (Int,Int) Int -> String mkpgm cm = header ++ "\n" ++ image where header = unwords ["P2",show width,show heigth,show maxval]
This may not work for many programs which read PGM files. The header is usually split into multiple lines, e.g. P2 256 256 255 Some programs may accept arbitrary whitespace between tokens, but others may insist upon newlines, e.g.: mkpgm cm = header ++ image where header = unlines $ map unwords [["P2"],[show width, show height],[show maxval]] Also:
(width,heigth) = snd $ bounds cm
This assumes that "fst $ bounds cm == (1,1)".
Not *very* beautiful, but seems to do the job for my stuff. I'll try the PPM library if I need something a tad more fancy - like colors :-)
Writing PPM is only marginally more complex, e.g.: mkppm :: Array (Int,Int) (Int, Int, Int) -> String mkppm cm = header ++ image where header = unlines $ map unwords [["P3"],[show width, show height],[show maxval]] image = unlines $ map showRGB $ elems cm width = x1 - x0 + 1 height = y1 - y0 + 1 ((x0,y0),(x1,y1)) = bounds cm maxval = maximum $ concatMap unRGB (elems cm) showRGB (r,g,b) = unwords [show r, show g, show b] unRGB (r,g,b) = [r,g,b] -- Glynn Clements <glynn.clements@virgin.net>