diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index acb61291ccc..86840261578 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -74,7 +74,8 @@ Convert files to JPEG outfile = f + ".jpg" if infile != outfile: try: - Image.open(infile).save(outfile) + with Image.open(infile) as im: + im.save(outfile) except IOError: print("cannot convert", infile) diff --git a/docs/reference/ImageDraw.rst b/docs/reference/ImageDraw.rst index 6700deab42b..d888913c34a 100644 --- a/docs/reference/ImageDraw.rst +++ b/docs/reference/ImageDraw.rst @@ -20,14 +20,14 @@ Example: Draw a gray cross over an image from PIL import Image, ImageDraw - im = Image.open("hopper.jpg") + with Image.open("hopper.jpg") as im: - draw = ImageDraw.Draw(im) - draw.line((0, 0) + im.size, fill=128) - draw.line((0, im.size[1], im.size[0], 0), fill=128) + draw = ImageDraw.Draw(im) + draw.line((0, 0) + im.size, fill=128) + draw.line((0, im.size[1], im.size[0], 0), fill=128) - # write to stdout - im.save(sys.stdout, "PNG") + # write to stdout + im.save(sys.stdout, "PNG") Concepts diff --git a/docs/reference/ImageSequence.rst b/docs/reference/ImageSequence.rst index 251ea3a93fd..353e8099ef4 100644 --- a/docs/reference/ImageSequence.rst +++ b/docs/reference/ImageSequence.rst @@ -14,12 +14,11 @@ Extracting frames from an animation from PIL import Image, ImageSequence - im = Image.open("animation.fli") - - index = 1 - for frame in ImageSequence.Iterator(im): - frame.save("frame%d.png" % index) - index += 1 + with Image.open("animation.fli") as im: + index = 1 + for frame in ImageSequence.Iterator(im): + frame.save("frame%d.png" % index) + index += 1 The :py:class:`~PIL.ImageSequence.Iterator` class ------------------------------------------------- diff --git a/docs/reference/PixelAccess.rst b/docs/reference/PixelAccess.rst index 8a856992209..f28e58f8625 100644 --- a/docs/reference/PixelAccess.rst +++ b/docs/reference/PixelAccess.rst @@ -17,8 +17,8 @@ changes it. .. code-block:: python from PIL import Image - im = Image.open('hopper.jpg') - px = im.load() + with Image.open('hopper.jpg') as im: + px = im.load() print (px[4,4]) px[4,4] = (0,0,0) print (px[4,4]) diff --git a/docs/reference/PyAccess.rst b/docs/reference/PyAccess.rst index 6a492cd86c3..e00741c4323 100644 --- a/docs/reference/PyAccess.rst +++ b/docs/reference/PyAccess.rst @@ -18,8 +18,8 @@ The following script loads an image, accesses one pixel from it, then changes it .. code-block:: python from PIL import Image - im = Image.open('hopper.jpg') - px = im.load() + with Image.open('hopper.jpg') as im: + px = im.load() print (px[4,4]) px[4,4] = (0,0,0) print (px[4,4]) diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index 2fff26a7948..e27a57671e4 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -141,8 +141,8 @@ def Ghostscript(tile, size, fp, scale=1): startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.check_call(command, startupinfo=startupinfo) - im = Image.open(outfile) - im.load() + out_im = Image.open(outfile) + out_im.load() finally: try: os.unlink(outfile) @@ -151,7 +151,9 @@ def Ghostscript(tile, size, fp, scale=1): except OSError: pass - return im.im.copy() + im = out_im.im.copy() + out_im.close() + return im class PSFile: diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py index 6f26b90fa3a..c003926154e 100644 --- a/src/PIL/IcnsImagePlugin.py +++ b/src/PIL/IcnsImagePlugin.py @@ -370,7 +370,7 @@ def _save(im, fp, filename): for size in imf.info["sizes"]: imf.size = size imf.save("out-%s-%s-%s.png" % size) - im = Image.open(sys.argv[1]) - im.save("out.png") + with Image.open(sys.argv[1]) as im: + im.save("out.png") if sys.platform == "windows": os.startfile("out.png") diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 61980082983..027e4c42e6c 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -71,7 +71,10 @@ class ImageFont: def _load_pilfont(self, filename): with open(filename, "rb") as fp: + image = None for ext in (".png", ".gif", ".pbm"): + if image: + image.close() try: fullname = os.path.splitext(filename)[0] + ext image = Image.open(fullname) @@ -81,11 +84,14 @@ def _load_pilfont(self, filename): if image and image.mode in ("1", "L"): break else: + if image: + image.close() raise OSError("cannot find glyph data file") self.file = fullname - return self._load_pilfont_data(fp, image) + self._load_pilfont_data(fp, image) + image.close() def _load_pilfont_data(self, file, image): diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index e587d942dd9..059a71fe793 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -35,7 +35,9 @@ def grab(bbox=None, include_layered_windows=False, all_screens=False): im.load() os.unlink(filepath) if bbox: - im = im.crop(bbox) + im_cropped = im.crop(bbox) + im.close() + return im_cropped else: offset, size, data = Image.core.grabscreen(include_layered_windows, all_screens) im = Image.frombytes( diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py index f7e809279e4..fc50894236b 100644 --- a/src/PIL/ImageShow.py +++ b/src/PIL/ImageShow.py @@ -203,4 +203,5 @@ def get_command_ex(self, file, title=None, **options): print("Syntax: python ImageShow.py imagefile [title]") sys.exit() - print(show(Image.open(sys.argv[1]), *sys.argv[2:])) + with Image.open(sys.argv[1]) as im: + print(show(im, *sys.argv[2:])) diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 86a7ee8cb9c..b2f976dda0d 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -158,9 +158,9 @@ def load(self): o.close() try: - _im = Image.open(outfile) - _im.load() - self.im = _im.im + with Image.open(outfile) as _im: + _im.load() + self.im = _im.im finally: try: os.unlink(outfile) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index b5371db73f5..229eac2141e 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -448,9 +448,9 @@ def load_djpeg(self): raise ValueError("Invalid Filename") try: - _im = Image.open(path) - _im.load() - self.im = _im.im + with Image.open(path) as _im: + _im.load() + self.im = _im.im finally: try: os.unlink(path) diff --git a/src/PIL/SpiderImagePlugin.py b/src/PIL/SpiderImagePlugin.py index dd0620c14ba..cbd31cf82ed 100644 --- a/src/PIL/SpiderImagePlugin.py +++ b/src/PIL/SpiderImagePlugin.py @@ -304,21 +304,21 @@ def _save_spider(im, fp, filename): print("input image must be in Spider format") sys.exit() - im = Image.open(filename) - print("image: " + str(im)) - print("format: " + str(im.format)) - print("size: " + str(im.size)) - print("mode: " + str(im.mode)) - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.FLIP_LEFT_RIGHT) - print( - "saving a flipped version of %s as %s " - % (os.path.basename(filename), outfile) - ) - im.save(outfile, SpiderImageFile.format) + with Image.open(filename) as im: + print("image: " + str(im)) + print("format: " + str(im.format)) + print("size: " + str(im.size)) + print("mode: " + str(im.mode)) + print("max, min: ", end=" ") + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + im = im.transpose(Image.FLIP_LEFT_RIGHT) + print( + "saving a flipped version of %s as %s " + % (os.path.basename(filename), outfile) + ) + im.save(outfile, SpiderImageFile.format)