簡體   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