<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000099">
<font face="Calibri">Dobrý den,<br>
<br>
pracuji na parseru PNG obrázků a narazil jsem na pár problémů s
filtry. Postouji podle návodu </font><a
href="http://www.root.cz/clanky/radkove-filtry-v-png/">http://www.root.cz/clanky/radkove-filtry-v-png/</a>
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, ...<br>
<br>
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.<br>
<br>
class Pixel:<br>
def __init__(self, r, g = 0, b = 0):<br>
<br>
if type(r) in [list, bytes, tuple]:<br>
self.r = r[0]<br>
self.g = r[1]<br>
self.b = r[2]<br>
self.sum = self.r + self.g + self.b <br>
return<br>
self.r = r<br>
self.g = g<br>
self.b = b<br>
self.sum = self.r + self.g + self.b<br>
def adjust(self, r, g, b):<br>
return r % 256, g % 256, b % 256 <br>
def __sub__(self, obj):<br>
if not isinstance(obj, Pixel):<br>
raise(TypeError, "Unsupported operation")<br>
return Pixel(self.adjust(self.r - obj.r, self.g - obj.g,
self.b - obj.b)) <br>
def __add__(self, obj):<br>
if not isinstance(obj, Pixel):<br>
raise(TypeError, "Unsupported operation")<br>
return Pixel(self.adjust(self.r + obj.r, self.g + obj.g,
self.b + obj.b)) <br>
def __repr__(self):<br>
return "P(%d, %d, %d)" % (self.r, self.g, self.b)<br>
def __abs__(self):<br>
return Pixel(abs(self.r), abs(self.g), abs(self.b))<br>
def __rshift__(self, shift):<br>
return Pixel(self.r >> shift, self.g >> shift,
self.g >> shift)<br>
def __lt__(self, obj):<br>
if self.sum < obj.sum:<br>
return True<br>
return False <br>
def __le__(self, obj):<br>
if self.sum <= obj.sum:<br>
return True<br>
return False <br>
def __gt__(self, obj):<br>
if self.sum > obj.sum:<br>
return True<br>
return False <br>
def __gt__(self, obj):<br>
if self.sum >= obj.sum:<br>
return True<br>
return False <br>
<br>
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ě?<br>
<br>
Děkuji za Váš čas,<br>
<br>
Jakub Vojáček<br>
<br>
<br>
<br>
</body>
</html>