Add support for PNG filters average and paeth

This commit is contained in:
Manuel Zapata 2016-08-12 11:36:36 +01:00
parent 41d90b4d14
commit 60dff8d785
2 changed files with 28 additions and 1 deletions

View File

@ -34,7 +34,9 @@ Implementation of stream filters for PDF.
__author__ = "Mathieu Fenniak"
__author_email__ = "biziqe@mathieu.fenniak.net"
from .utils import PdfReadError, ord_, chr_
import math
from .utils import PdfReadError, ord_, chr_, paethPredictor
from sys import version_info
if version_info < ( 3, 0 ):
from cStringIO import StringIO
@ -136,6 +138,17 @@ class FlateDecode(object):
elif filterByte == 2:
for i in range(1, rowlength):
rowdata[i] = (rowdata[i] + prev_rowdata[i]) % 256
elif filterByte == 3:
for i in range(2, rowlength):
floor = math.floor(rowdata[i-1] + prev_rowdata[i])/2
rowdata[i] = (rowdata[i] + int(floor)) % 256
elif filterByte == 4:
for i in range(2, rowlength):
left = rowdata[i - 1]
up = prev_rowdata[i]
up_left = prev_rowdata[i - 1]
paeth = paethPredictor(left, up, up_left)
rowdata[i] = (rowdata[i] + paeth) % 256
else:
# unsupported PNG filter
raise PdfReadError("Unsupported PNG filter %r" % filterByte)

View File

@ -283,3 +283,17 @@ def hexStr(num):
WHITESPACES = [b_(x) for x in [' ', '\n', '\r', '\t', '\x00']]
def paethPredictor(left, up, up_left):
p = left + up - up_left
dist_left = abs(p - left)
dist_up = abs(p - up)
dist_up_left = abs(p - up_left)
if dist_left <= dist_up and dist_left <= dist_up_left:
return left
elif dist_up <= dist_up_left:
return up
else:
return up_left