ppm-dump

From Noah.org
Jump to: navigation, search
#!/usr/bin/env python

import sys

class ppm:

    '''This writes a 24-bit color PPM (PNM) formatted images (P3 or P6 format).
    This represents an RGB canvas to which you can use the draw() or spray()
    methods to modify pixels. When done you use the __str__() method to output
    the image as a PPM format. '''

    def __init__(self, width=100, height=100, is_ascii=False):

        self.width = width
        self.height = height
        self.is_ascii = is_ascii
        self.index_max = width*height
        self.plane_r = [0] * self.index_max
        self.plane_g = [0] * self.index_max
        self.plane_b = [0] * self.index_max
        self.imax = 255
        self.index = 0

    def draw (self, x, y, r, g, b):

        index = (y*self.width+x)%self.index_max
        self.plane_r[index] = r%256
        self.plane_g[index] = g%256
        self.plane_b[index] = b%256

    def spray (self, r, g, b):

        self.plane_r[self.index] = r%256
        self.plane_g[self.index] = g%256
        self.plane_b[self.index] = b%256
        self.index = (self.index+1)%self.index_max

    def __str__(self):

        ppm_str = ''
        if self.is_ascii:
            # ASCII
            ppm_str = ppm_str + "P3"
        else:
            # binary
            ppm_str = ppm_str + "P6"
        ppm_str = ppm_str + "\n"
        ppm_str = ppm_str + str(self.width)
        ppm_str = ppm_str + " "
        ppm_str = ppm_str + str(self.height)
        ppm_str = ppm_str + "\n"
        ppm_str = ppm_str + str(self.imax)
        ppm_str = ppm_str + "\n"
        for index in range(self.index_max):
            r = self.plane_r[index]
            g = self.plane_g[index]
            b = self.plane_b[index]
            if self.is_ascii:
                ppm_str = ppm_str + ('%3d %3d %3d ' % (r,g,b))
                if not ((1+index) % 6):
                    ppm_str = ppm_str + '\n'
            else:
                ppm_str = ppm_str + chr(r) + chr(g) + chr(b)
        return ppm_str


if __name__ == '__main__':

    p = ppm(400,400)
    # Spray bytes from stdin onto canvas.
    for ii in range (1, p.index_max):
        try:
            r = ord(sys.stdin.read(1))
            g = ord(sys.stdin.read(1))
            b = ord(sys.stdin.read(1))
            p.spray(r,g,b)
        except TypeError, e:
            # read(1) returned empty string.
            break

    # Dump the PPM file to stdout.
    sys.stdout.write(str(p))