[英]how to properly read a PPM file using Python
这是我的总体说明
编写一个Color类,该类使用介于0到255之间的整数值表示RGB颜色。您的类必须:被放置在image.py中,提供一个构造函数,该构造函数接受来自客户端并存储的红色,绿色和蓝色通道的值这些值提供返回红色,绿色和蓝色通道值的公共方法
编写一个表示PPM图像的PortablePixmap类。 您的课程必须:被放置在image.py中。提供一个构造器,该构造器从客户端接受幻数,宽度,高度,最大颜色值和像素数据,并将这些值存储起来。将像素数据存储为(或列表列表)的颜色对象提供一个公共方法,该方法返回PPM图像的字符串表示形式
编写read_ppm函数,以打开PPM图像文件,读取其内容并返回保存其内容的PortablePixmap对象。 您的函数必须:放置在image.py中。读取PPM图像文件的内容对PPM图像文件的格式不敏感。如果预期像素数和提供的像素数不同,则返回错误
编写一个主函数来测试您的read_ppm函数。 您的函数必须放在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.我什至需要在该课程中专门提出任何例外情况吗? 最终,我们将从一个按顺序包含所有内容的文件中进行读取,但不一定是在其单独的一行上。
我真的只想知道我是否正确进行此操作。 这些说明似乎是逐步的,但我并不是很了解所有事物之间的联系,因此我担心自己做得太多或太少。
提前致谢
从规范中不清楚您是否需要检查这些值,并且检查仅在某些情况下会引发异常,否则会导致副作用(打印); 从重用的角度来看,我宁愿只包含例外(如果有)。 除了缩进错误(我认为只是在这里,而不是在您的源代码中)之外,Color类看起来可以满足需求,尽管它们与访问器完全无关。 可能有人受过Java培训。
该文档字符串应位于PortablePixmap类内部,而不是其上方。
最引人注目的是要求您的类不给PPM 和存储像素作为8位无符号RGB的格式敏感的组合。 这使得不可能支持所有PPM,因为它们支持16位值(请注意PPM格式的maxval字段)。
您的PortablePixmap类也不使用Color类:“将像素数据存储为Color对象的列表(或Color对象的列表)”。 该要求迫使实施起来效率非常低下,但是我想这整个过程都是一种练习。 您需要从像素数据字符串中提取RGB三胞胎。 这也是您需要指定的一张支票的地方; 验证像素数是否正确。 如果失败,可能会遇到ValueError异常。
如果我正在写这种东西,我可能会使用插槽来减少诸如Color之类的内存使用,使用数组来处理大量有限范围的数值,并可能使用一些属性来使存储透明而不使用笨拙的getter方法。 拆分和合并将使处理像素集合更加容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.