Dobrý den,

pracuji na parseru PNG obrázků a narazil jsem na pár problémů s filtry. Postouji podle návodu http://www.root.cz/clanky/radkove-filtry-v-png/ a zasekl jsem se hned u prvního (sub) filtru. Nevím, jak mám reagovat to, když mi výsledek po odečtení podteče (například 128-255). RGB nemůže mít záporné hodnoty, mám tedy na výsledek zavolat funkci abs? Podobný problém nastává, pokud výsledek přeteče (je vyšší než 255). Mám vše vyšší než 255 zaokrouhlovat na 255? Nebo mám použít modulo 256? Ani jedno z vyše uvedených mi myslím nefunguje správně, protože složky RGB by měly nabývat pouze hodnot 0, 128, 255 (jedná se o interpet jazkyka brainloller) a mně tam vznikají složky jako 1, 254, 127, ...

Nadefinoval jsem si třídu Pixel, na které provádím ty operaci +, - a pořeboval bych nějak upravit metodu adjust, která myslím nevrací správné výsledky.

class Pixel:
    def __init__(self, r, g = 0, b = 0):

        if type(r) in [list, bytes, tuple]:
            self.r = r[0]
            self.g = r[1]
            self.b = r[2]
            self.sum = self.r + self.g + self.b
            return
        self.r = r
        self.g = g
        self.b = b
        self.sum = self.r + self.g + self.b
    def adjust(self, r, g, b):
        return r % 256, g % 256, b % 256
    def __sub__(self, obj):
        if not isinstance(obj, Pixel):
            raise(TypeError, "Unsupported operation")
return Pixel(self.adjust(self.r - obj.r, self.g - obj.g, self.b - obj.b))
    def __add__(self, obj):
        if not isinstance(obj, Pixel):
            raise(TypeError, "Unsupported operation")
return Pixel(self.adjust(self.r + obj.r, self.g + obj.g, self.b + obj.b))
    def __repr__(self):
        return "P(%d, %d, %d)" % (self.r, self.g, self.b)
    def __abs__(self):
        return Pixel(abs(self.r), abs(self.g), abs(self.b))
    def __rshift__(self, shift):
        return Pixel(self.r >> shift, self.g >> shift, self.g >> shift)
    def __lt__(self, obj):
        if self.sum < obj.sum:
            return True
        return False
    def __le__(self, obj):
        if self.sum <= obj.sum:
            return True
        return False
    def __gt__(self, obj):
        if self.sum > obj.sum:
            return True
        return False
    def __gt__(self, obj):
        if self.sum >= obj.sum:
            return True
        return False

Také bych měl dotaz na čtvrtý filtr (filtr s paeth prediktorem). Mají se tam porovnávat pixely, ale jediný způsob, na který jsem přišel, jak porovnat pixely je sečíst všechny složky rgb (self.sum) a porovnávat je. Je to tak správně?

Děkuji za Váš čas,

Jakub Vojáček



_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Reply via email to