繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM