<!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>