RosettaCodeData/Task/Bitmap-Read-a-PPM-file/Rebol/bitmap-read-a-ppm-file.rebol
2026-04-30 12:34:36 -04:00

50 lines
1.5 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Rebol [
title: "Rosetta code: Bitmap/Read a PPM file"
file: %Bitmap-Read_a_PPM_file.r3
url: https://rosettacode.org/wiki/Bitmap/Read_a_PPM_file
]
decode-ppm: function[ppm [string! file! url!]][
;; Load source into a string if a file or URL was given
unless string? ppm [ppm: read/string ppm]
if all [
;; Strip the "P3" magic header and any comment lines
parse/case ppm ["P3" any [LF | #"#" to LF skip] ppm: to end]
;; Lex the remaining text into Rebol values
try [ppm: transcode ppm]
;; Extract image dimensions, colour depth, and raw RGB values
parse ppm [
set width: integer!
set height: integer!
set depth: integer!
rgb: to end
]
][
img: make image! as-pair width height
i: 1 clr: 0.0.0
foreach [r g b] rgb [
;; Normalise each channel to 0255
clr/1: 255 * (r / depth)
clr/2: 255 * (g / depth)
clr/3: 255 * (b / depth)
img/:i: clr
++ i
]
;; Return the completed image
img
]
]
img: decode-ppm {P3
# feep.ppm
4 4
15
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0}
print "Source image:"
print img
print "Grayscale PPM output:"
print to-ppm grayscale img ;@@ https://rosettacode.org/wiki/Bitmap/Write_a_PPM_file