Added fill decoder

This commit is contained in:
Andrew Murray 2022-06-16 19:07:10 +10:00
parent b3bc4a7bb4
commit 290a662793
3 changed files with 29 additions and 3 deletions

Binary file not shown.

View File

@ -2,7 +2,7 @@ import pytest
from PIL import Image from PIL import Image
from .helper import assert_image_equal_tofile from .helper import assert_image_equal, assert_image_equal_tofile
FpxImagePlugin = pytest.importorskip( FpxImagePlugin = pytest.importorskip(
"PIL.FpxImagePlugin", reason="olefile not installed" "PIL.FpxImagePlugin", reason="olefile not installed"
@ -18,6 +18,20 @@ def test_sanity():
assert_image_equal_tofile(im, "Tests/images/input_bw_one_band.png") assert_image_equal_tofile(im, "Tests/images/input_bw_one_band.png")
def test_fill():
with Image.open("Tests/images/input_bw_fill.fpx") as im:
# The first tile has been hexedited to fill with white
compression, (x, y, x1, y1) = im.tile[0][:2]
assert compression == "fpx_fill"
assert (x, y, x1, y1) == (0, 0, 64, 46)
with Image.open("Tests/images/input_bw_one_band.png") as im2:
for x in range(x1):
for y in range(y1):
im2.putpixel((x, y), 255)
assert_image_equal(im, im2)
def test_invalid_file(): def test_invalid_file():
# Test an invalid OLE file # Test an invalid OLE file
invalid_file = "Tests/images/flower.jpg" invalid_file = "Tests/images/flower.jpg"

View File

@ -171,10 +171,9 @@ class FpxImageFile(ImageFile.ImageFile):
elif compression == 1: elif compression == 1:
# FIXME: the fill decoder is not implemented
self.tile.append( self.tile.append(
( (
"fill", "fpx_fill",
(x, y, x1, y1), (x, y, x1, y1),
i32(s, i) + 28, i32(s, i) + 28,
(self.rawmode, s[12:16]), (self.rawmode, s[12:16]),
@ -236,10 +235,23 @@ class FpxImageFile(ImageFile.ImageFile):
return ImageFile.ImageFile.load(self) return ImageFile.ImageFile.load(self)
class FpxFillDecoder(ImageFile.PyDecoder):
_pulls_fd = True
def decode(self, buffer):
rawmode, color = self.args
bands = Image.getmodebands(rawmode)
data = color[:bands] * self.state.xsize * self.state.ysize
self.set_as_raw(data, rawmode)
return -1, 0
# #
# -------------------------------------------------------------------- # --------------------------------------------------------------------
Image.register_open(FpxImageFile.format, FpxImageFile, _accept) Image.register_open(FpxImageFile.format, FpxImageFile, _accept)
Image.register_decoder("fpx_fill", FpxFillDecoder)
Image.register_extension(FpxImageFile.format, ".fpx") Image.register_extension(FpxImageFile.format, ".fpx")