首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python正确读取PPM文件

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

Stack Overflow用户
提问于 2014-04-05 13:19:30
回答 1查看 2.8K关注 0票数 0

这是我的总体指示

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

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

编写一个read_ppm函数,该函数打开PPM图像文件,读取其内容,并返回保存其内容的PortablePixmap对象。您的函数必须放在image.py中,读取PPM图像文件的内容,如果期望的像素数和提供的像素数不同,则对PPM图像文件的格式不敏感,退出时会出错。

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

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

代码语言:javascript
复制
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.我甚至需要在该类中引发任何异常吗?我们最终将从一个包含所有内容的文件中读取,但不一定是在它自己的单独行上。

我只想知道我是否正确地做了这件事。这些说明似乎是循序渐进的,但我并不真正理解一切是如何联系起来的,所以我恐怕不是做得太多,就是做得太少。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-05 14:03:18

规范中不清楚是否需要检查值,而且在某些情况下,检查只会引发异常,否则会产生副作用(打印);从重用的角度来看,我希望只有异常(如果有的话)。除了缩进错误(我假设只有在这里,而不是在您的源代码中)之外,Color类看起来涵盖了这些需求,尽管它们与访问器的关系非常不复杂;可能有人是由Java训练的。

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

最值得注意的是要求您的类对PPM的格式不敏感,并将像素存储为8位无符号RGB。这使得不可能支持所有的PPM,因为它们支持16位值(注意PPM格式中的maxval字段)。

您的PortablePixmap类也不使用颜色类:“将像素数据存储为颜色对象列表(或列表列表)”。这个需求强制了一个非常低效率的实现,但我想,整个过程是一个练习。您需要从像素数据字符串中提取RGB三重奏。这也是您需要指定的一次检查的地方;验证正确的像素数。如果失败的话,人们可能会期望出现ValueError异常。

如果我编写这样的东西,我可能会使用插槽来减少类的内存使用量,比如列阵来处理大量有限范围的数值,以及可能使用属性来使存储透明而不使用笨重的getter方法。拆分加入将使处理像素集合更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22881429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档