mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-05 04:13:11 +03:00
Merge pull request #6096 from radarhere/cleanup
This commit is contained in:
commit
c16737d589
|
@ -200,6 +200,9 @@ class MockPyEncoder(ImageFile.PyEncoder):
|
||||||
def encode(self, buffer):
|
def encode(self, buffer):
|
||||||
return 1, 1, b""
|
return 1, 1, b""
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
self.cleanup_called = True
|
||||||
|
|
||||||
|
|
||||||
xoff, yoff, xsize, ysize = 10, 20, 100, 100
|
xoff, yoff, xsize, ysize = 10, 20, 100, 100
|
||||||
|
|
||||||
|
@ -327,10 +330,12 @@ class TestPyEncoder(CodecsTest):
|
||||||
im = MockImageFile(buf)
|
im = MockImageFile(buf)
|
||||||
|
|
||||||
fp = BytesIO()
|
fp = BytesIO()
|
||||||
|
self.encoder.cleanup_called = False
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ImageFile._save(
|
ImageFile._save(
|
||||||
im, fp, [("MOCK", (xoff, yoff, -10, yoff + ysize), 0, "RGB")]
|
im, fp, [("MOCK", (xoff, yoff, -10, yoff + ysize), 0, "RGB")]
|
||||||
)
|
)
|
||||||
|
assert self.encoder.cleanup_called
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
ImageFile._save(
|
ImageFile._save(
|
||||||
|
|
|
@ -223,11 +223,11 @@ class ImageFile(Image.Image):
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
for decoder_name, extents, offset, args in self.tile:
|
for decoder_name, extents, offset, args in self.tile:
|
||||||
|
seek(offset)
|
||||||
decoder = Image._getdecoder(
|
decoder = Image._getdecoder(
|
||||||
self.mode, decoder_name, args, self.decoderconfig
|
self.mode, decoder_name, args, self.decoderconfig
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
seek(offset)
|
|
||||||
decoder.setimage(self.im, extents)
|
decoder.setimage(self.im, extents)
|
||||||
if decoder.pulls_fd:
|
if decoder.pulls_fd:
|
||||||
decoder.setfd(self.fp)
|
decoder.setfd(self.fp)
|
||||||
|
@ -499,40 +499,33 @@ def _save(im, fp, tile, bufsize=0):
|
||||||
try:
|
try:
|
||||||
fh = fp.fileno()
|
fh = fp.fileno()
|
||||||
fp.flush()
|
fp.flush()
|
||||||
except (AttributeError, io.UnsupportedOperation) as exc:
|
exc = None
|
||||||
# compress to Python file-compatible object
|
except (AttributeError, io.UnsupportedOperation) as e:
|
||||||
for e, b, o, a in tile:
|
exc = e
|
||||||
e = Image._getencoder(im.mode, e, a, im.encoderconfig)
|
for e, b, o, a in tile:
|
||||||
if o > 0:
|
if o > 0:
|
||||||
fp.seek(o)
|
fp.seek(o)
|
||||||
e.setimage(im.im, b)
|
encoder = Image._getencoder(im.mode, e, a, im.encoderconfig)
|
||||||
if e.pushes_fd:
|
try:
|
||||||
e.setfd(fp)
|
encoder.setimage(im.im, b)
|
||||||
l, s = e.encode_to_pyfd()
|
if encoder.pushes_fd:
|
||||||
|
encoder.setfd(fp)
|
||||||
|
l, s = encoder.encode_to_pyfd()
|
||||||
else:
|
else:
|
||||||
while True:
|
if exc:
|
||||||
l, s, d = e.encode(bufsize)
|
# compress to Python file-compatible object
|
||||||
fp.write(d)
|
while True:
|
||||||
if s:
|
l, s, d = encoder.encode(bufsize)
|
||||||
break
|
fp.write(d)
|
||||||
|
if s:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
# slight speedup: compress to real file object
|
||||||
|
s = encoder.encode_to_file(fh, bufsize)
|
||||||
if s < 0:
|
if s < 0:
|
||||||
raise OSError(f"encoder error {s} when writing image file") from exc
|
raise OSError(f"encoder error {s} when writing image file") from exc
|
||||||
e.cleanup()
|
finally:
|
||||||
else:
|
encoder.cleanup()
|
||||||
# slight speedup: compress to real file object
|
|
||||||
for e, b, o, a in tile:
|
|
||||||
e = Image._getencoder(im.mode, e, a, im.encoderconfig)
|
|
||||||
if o > 0:
|
|
||||||
fp.seek(o)
|
|
||||||
e.setimage(im.im, b)
|
|
||||||
if e.pushes_fd:
|
|
||||||
e.setfd(fp)
|
|
||||||
l, s = e.encode_to_pyfd()
|
|
||||||
else:
|
|
||||||
s = e.encode_to_file(fh, bufsize)
|
|
||||||
if s < 0:
|
|
||||||
raise OSError(f"encoder error {s} when writing image file")
|
|
||||||
e.cleanup()
|
|
||||||
if hasattr(fp, "flush"):
|
if hasattr(fp, "flush"):
|
||||||
fp.flush()
|
fp.flush()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user