[python] Parsování PNG

Jakub Vojáček jakohv na seznam.cz
Úterý Březen 20 13:09:55 CET 2012


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



------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120320/b63ea5ca/attachment.html>


Další informace o konferenci Python