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