[Haskell]PGMファイルを生成する part3

やりたいこと

昨日まででランダムな配列を作成することが出来るようになったから、
出力の形式を整えてPGMファイルを生成する。

プログラム

foldrを使ってこんな感じで書いてみた。
import System.IO
import System.Random
import Control.Monad (replicateM)

main = do
    -- PGM Header
    let pgm_type = "P5\n"
    let pgm_comment = "# PGM type grayscale image\n"
    let pgm_size = (255,255)
    let pgm_max_brightness = 255

    let pgm_size_string = (show (fst pgm_size)) ++ " " ++ (show (snd pgm_size)) ++ "\n"
    let pgm_max_brightness_string = (show pgm_max_brightness) ++ "\n"
    let pgm_header = pgm_type ++ pgm_comment ++ pgm_size_string ++ pgm_max_brightness_string
    let pgm_filename = "test.pgm"

    fh <- openFile pgm_filename WriteMode
    hPutStr fh pgm_header

    -- Main
    pixels <- replicateM (255*255) $ (getStdRandom $ randomR (0,255) :: IO Int)
    hPutStr fh ((foldr (\x xs -> (show x) ++ " " ++ xs ) "") pixels)
    hClose fh
実行するとこんな感じの内容のファイルができる。
P5
# PGM type grayscale image
255 255
255
161 28 110 0 235 98 1 110 129 83 53 227 166 26 185 114 64 144 21 123 190 127 192 195 168 8 228 218 43 174 117 134 168 123 200 212 227 117 249 64 133 180 74 195 83 189 36 151 192 169 107 191 139 59 71 46 196 195 50 214 21 106 184 108 230 123 88 53 80 243 212 126 229 135 107 17 111 191 94 26 15 171 22 54 115 235 80 177 53 8 90 237 185 153 70 114 11 133 117 138 78 54 63 224 207 52 162 198 127 13 161 69 54 146 189 219 208 126 165 84 33 106 246 54 1 3 198 50 19 150 47 148 235 127 142 134 168 16 151 116 28 148 122 38 111 73 35 10 198 13 102 62 44 218 177 81 248 142 166 114 195 7 147 77 237 148 60 250 117 41 68 47 89 202 94 108 10 66 124 227 101 220 34 170 217 186 217 59 8 182 80 39 97 102 100 170 109 133 237 137 90 119 28 106 203 191 225 32 164 156 137 132 254 75 253 25 1 197 104 193 209 148 214 10 253 171 53 189 212 252 100 140 251 46 9 121 134 169 242 22 11 172 163 232 36 182 22 241 244 37 93 129 223 215 195 70 255 140 154 20 132 210 102 196 75 233 140 138 247 195 108 115 136 67 144 160 145 244 197 254 62 158 71 117 1 65 72 162 94 37 65 87 1 185 58 45 214 44 237 100 57 217 30 214 35 149 167 76 205 191 221 204 2 183 149 106 87 64 213 47 143 199 208 211 246 194 215 202 38 138 106 181 148 193 104 211 144 245 127 118 55 103 34 188 22 13 254 127 4 64 145 179 199 75 232 43 167 167 120 93 56 51 166 96 118 79 193 157 221 138 55 66 48 48 102 24 100 114 221 182 152 212 245 241 122 194 123 244 17 62 91 32 74 108 249 207 232 151 122 6 65 237 142 109 66 231 106 23 117 60 92 157 162 68 11 181 104 85 180 16 149 200 111 151 60 133 172 169 142 237 94 155 47 28 33 55 43 176 29 156 134 44 81 245 129 228 57 114 243 142 223 55 150 216 61 212 216 246 177 120 121 40 207 183 8 109 223 166 138 31 122 238 178 29 242 215 115 108 176 244 69 124 45 16 207 163 74 79 222 113 226 250 85 85 145 2 152 177 171 142 191 10 240 143 197 240 171 177 80 87 89 58 201 97 14 55 9 103 217 86 166 25 234 176 50 45 20 91 11 6 59 239 68 149 248 84 222 24 81 60 21 192 99 207 137 226 178 33 93 230 36 112 225 26 184 204 207 16 136 176 77 139 135 175 74 55 104 46 107 125 116 7 54 128 71 254 232 164 240 38 128 3 95 254 85 26 54 95 249 65 210 47 55 6 5 185 110 89 238 70 87 41 34 194 39 23 151 82 222 143 244 200 171 133 220 108 43 250 140 129 59 198 135 46 234 151 48 237 120 75 115 122 71 160 106 1 107 170 253 97 71 195 252 109 16 34 197 247 143 110 190 166 93 218 230 216 191 137 76 211 248 17 100 75 220 71 132 60 228 208 41 236 104 234 42 79 243 47 96 207 75 117 72 142 131 131 112 53 184 61 68 26 214 68 237 122 15 16 232 220 133 86 62 209 85 148 140 208 224 117 133 31 120 150 231 137 117 95 174 53 76 85 145 146 223 22 55 38 195 255 156 183 21 115 218 118 105 153 149 124 51 64 166 72 8 42 166 129 193 101 162 68 195 45 181 62 118 227 156 87 125 42 210 140 10 120 232 60 162 99 141 241 222 54 208 169 128 14 38 171 217 237 55 185 183 126 54 14 102 163 11 74 122 5 199 14 68 38 19 61 174 75 142 101 25 25 114 238 177 205 253 71 182 60 162 235 3 137 29 114 163 141 187 92 229 47 151 76 90 152 215 173 189 172 13 117 173 196 254 205 254 39 230 234 119 240 101 89 238 0 220 125 13 209 147 52 115 17 3 62 157 186 124 174 212 123 121 168 32 121 156 226 138 145 165 44 172 240 69 96 64 241 125 175 177 77 222 170 36 174 251 99 72 138 182 140 45 243 31 233 57 237 63 32 119 48 82 84 250 46 87 59 199 18 49 201 53 61 107 69 155 171 172 218 133 238 171 86 31 200 237 44 202 221 253 127 82 199 154 75 207 74 100 159 161 250 193 144 58 212 137 132 236 183 105 99 170 31 115 76 15 209 254 66 147 45 99 185 225 142 69 205 66 20 120 23 92 18 136 108 251 186 102 98 91 127 193 214 182 230 237 144 36 188 164 203 182 77 241 167 0 88 139 100 115 145 23 207 80 255 213 243 212 215 202 3 97 194 180 198 234 36 233 252 66 251 251 225 6 46 51 130 168 167 18 163 122 244 97 247 157 63 149 149 217 203 76 154 116 4 20 234 184 190 68 86 197 234 31 144 155 18 24 206 101 182 221 87 192 197 120 73 180 251 192 26 94 85 83 18 105 150 165 22 117 115 43 18 40 242 216 144 129 233 209 197 220 254 51 127 179 51 87 134 88 211 147 176 142 48 204 89 88 221 235 40 33 208 206 241 121 146 12 208 211 57 37 195 159 60 108 17 251 110 54 238 67 126 126 151 132 48 84 220 135 110 174 209 249 79 73 71 80 204 200 72 156 230 17 114 119 86 173 137 217 23 111 75 211 187 181 229 19 47 80 251 39 179 136 119 99 154 240 190 92 239 70 231 37 197 103 25 57 197 216 39 252 31 20 123 182 3 175 53 76 70 38 49 208 12 255 66 94 38 185 190 247 14 180 45 164 154 97 57 17 204 195 249 239 230 95 230 38 23 64 154 65 121 68 214 195 75 97 188 160 74 184 102 73 106 75 225 254 5 154 0 167 201 107 96 63 243 79 184 66 45 135 205 233 14 200 111 199 52 44 128 183 226 82 163 42 224 127 38 245 75 155 57 86 178 4 24 113 51 179 198 114 200 136 121 139 105 2 53 14 114 94 159 103 141 100 146 97 159 250 228 62 52 89 134 191 109 146 108 239 186 214 236 86 108 15 25 175 37 188 169 23 7 190 31 142 133 56 62 7 13 208 21 161 216 115 234 185 58 100 79 146 192 21 93 9 122 70 213 157 38 218 200 229 182 105 28 127 86 126 229 34 220 95 43 24 218 109 138 100 146 143 184 9 45 211 31 86 69 251 241 222 12 176 54 162 16 121 1 121 215 79 128 218 97 45 251 50 169 157 157 84 36 193 92 123 221 108 29 93 54 5 197 73 29 40 162 38 172 206 211 197 41 172 37 183 226 197 182 170 218 185 89 123 159 19 228 220 2 118 244 79 105 71 231 65 116 111 82 61 215 157 78 7 96 51 190 196 230 12 11 195 195 30 116 237 112 232 54 201 79 186 190 59 179 209 203 45 224 60 133 88 116 60 115 238 104 255 249 79 210 7 62 41 246 164 241 237 157 207 247 63 21 95 241 18 48 151 20 224 167 108 145 77 121 228 215 223 104 184 99 137 255 158 34 131 119 227 144 137 46 58 99 237 106 160 49 76 76 107 194 228 175 26 67 233 30 80 75 127 51 213 160 105 140 235 40 234 163 94 121 242 113 135 18 172 72 37 205 72 159 46 179 35 6 79 127 65 95 158 139 194 16 220 112 202 17 235 32 36 115 179 123 31 32 109 215 88 64 27 251 93 211 62 101 191 173 216 218 8 1 255 244 149 78 199 13 245 197 88 177 69 248 102 150 33 128 167 39 42 65 191 235 48 228 229 41 1 157 231 30 95 120 49 183 254 59 64 135 68 14 84 123 247 201 39 27 109 102 100 97 85 237 197 129 224 193 176 124 98 53 74 97 144 99 60 217 17 74 35 21 117 119 71 199 183 74 67 228 125 128 210 34 129 210 39 109 89 193 242 175 105 222 227 155 33 137 155 145 76 171 114 106 249 156 118 212 105 16 140 247 108 78 12 67 173 6 178 4 110 186 70 248 81 254 115 216 97 33 245 91 248 147 182 66 253 143 198 152 152 205 164 101 178 52 242 141 224 109 71 220 53 21 40 197 24 82 139 239 1 176 25 75 182 49 240 229 247 37 127 232 36 132 79 131 150 181 60 175 16 ・・・
そして、PGM形式の画像が見れるビューワーで画像を見るとこんな感じになる。
ランダム配列だからこんな感じだね。
zuqqhi2

某Web系の会社でエンジニアをやっています。 学術的なことに非常に興味があります。 趣味は楽器演奏、ジョギング、読書、料理などなど手広くやっています。