如何使用Python正确读取PPM文件

时间:2014-04-05 13:19:30

标签: python tokenize ppm

以下是我的整体说明

使用0到255范围内的整数值编写一个表示RGB颜色的Color类。您的类必须:         放在image.py中         提供一个构造函数,该构造函数接受来自客户端的红色,绿色和蓝色通道的值并存储这些值         提供返回红色,绿色和蓝色通道值的公共方法

编写一个表示PPM图像的PortablePixmap类。你的班级必须:         放在image.py中         提供一个构造函数,该构造函数接受来自客户端的幻数,宽度,高度,最大颜色值和像素数据,并存储这些值         将像素数据存储为Color对象的列表(或列表)         提供一个返回PPM图像的字符串表示的公共方法

编写read_ppm函数,该函数打开PPM图像文件,读取其内容,并返回保存其内容的PortablePixmap对象。你的功能必须:         放在image.py中         阅读PPM图像文件的内容         对PPM图像文件的格式不敏感         如果预期和提供的像素数不同,则退出并显示错误

编写一个测试read_ppm函数的main函数。您的函数必须放在main.py

这是我到目前为止所拥有的

class Color:
# constructor takes in values from client and stores them
def __init__(self, red, green, blue): 


    # checks that type of arg == int: raises exception otherwise 
    if (isinstance(red, int) and isinstance(green, int) and isinstance(blue, int)):     
        print("good stuff, indeed integers")
    else:   
        raise TypeError("Argument must be an integer.")

    # checks if values are between 0 and 225 
    if red < 0 or red > 225: 
        print("0 < rgb values < 225")
    elif green < 0 or green > 225:
        print("0 < rgb values < 225") 
    elif blue < 0 or blue > 225:
        print("0 < rgb values < 225")

    # instance variables (RGB values)
    self._red = red 
    self._green = green
    self._blue = blue 


# methods that reuturn RGB values
def returnRed(self): 
    return self._red 

def returnGreen(self):
    return self._green

def returnBlue(self):
    return self._blue


'''class that represents a PPM image'''
class PortablePixmap:
    def __init__(self, magic_number, width, height, max_color_value, pixel_data):
        self._magic_number = magic_number
        self._width = width
        self._height = height
        self._max_color_value = max_color_value
        self._pixel_data = pixel_data


    def __str__(self):
        s = self._magic_number
        s += '\n' + str(self._width)
        s += ' ' + str(self._height)
        s += '\n' + str(self._max_color_value)
        for pixel in self._pixel_data:
            s += ' ' + str(pixel[0])
            s += ' ' + str(pixel[1])
            s += ' ' + str(pixel[2])

        return s

我有几个问题需要澄清.. 1.我是否正确创建了Color类? 2.我是否需要特别提出该课程中的任何例外情况?我们最终将从包含所有内容的文件中读取,但不一定是它自己的个别行。

我真的只是想知道我是否正确地解决了这个问题。说明似乎是逐步的,但我并不是真的理解一切如何联系,所以我担心我做得太多或太少。

提前致谢

1 个答案:

答案 0 :(得分:0)

从规范中不清楚您需要检查值,并且您的检查仅在某些情况下引发异常,否则会导致副作用(打印);从重用的角度来看,我更愿意只有例外情况。除了缩进错误(我假设只是在这里,而不是在你的源代码中),Color类看起来可以满足需求,尽管它们与访问器非常不同步;可能有人受过Java训练。

docstring应该在PortablePixmap类中,而不是在它上面。

最值得注意的是,您的班级对PPM 的格式不敏感的要求组合为8位无符号RGB。这使得无法支持所有PPM,因为它们支持16位值(请注意PPM format中的maxval字段)。

您的PortablePixmap类也不使用Color类:“将像素数据存储为Color对象列表(或列表)”。这个要求迫使一个非常低效的实施,但我认为整个事情是一个练习。您需要从像素数据字符串中提取RGB三元组。这也是您需要指定的一个检查的地方;验证是否有正确数量的像素。如果失败,可能会出现ValueError异常。

如果我正在写这类东西,我可能会使用slots来减少像Color这样的类的内存使用,arrays来处理大量有限范围的数值,并且可能{{3}在不使用笨重的getter方法的情况下使存储透明。 propertiessplit可以更轻松地处理像素集合。