Repository: python-pillow/Pillow

Issue:
OSError: [Errno 24] Too many open files for image.save for tiff images
**What did you do?**
I am opening a large number of jpg and tiff (single page & multi page) images, resizing them and saving them in a new directory. I am running this code within VS code in jupyter notebook using PIL 9.0.0

```python    
    def change_image_res(rep_image, 
                        new_path,
                        max_image_thresh=49, 
                        percent_reduce_res = [0.1, 0.2, 0.3, 0.4, 0.5]):

    image_name = rep_image.name
    save_all = True if rep_image.suffix == '.tiff' else False

    new_path = Path(new_path)

    with open(rep_image, "rb") as f:
        image = Image.open(f)
    
        if (image.size[0]*image.size[1])/1000000 > max_image_thresh:
            for res in percent_reduce_res:
                fixed_height = int(int((float(image.size[1]))) - (res * int((float(image.size[1])))))
                height_percent = (fixed_height / float(image.size[1]))
                width_size = int((float(image.size[0]) * float(height_percent)))
                if fixed_height*width_size/1000000 < 50:
                    image = image.resize((width_size, fixed_height), PIL.Image.NEAREST)
                    image.save(f'{new_path}\{image_name}', dpi=(300,300), save_all=save_all)
                    break
        else:
            image.save(f'{new_path}\{image_name}', dpi=(300,300), save_all=save_all)
```

**What did you expect to happen?**
I expected the images to be opened, processed, saved and closed automatically because of the context manager.

**What actually happened?**

After opening over a thousand images I get the following error

> OSError: [Errno 24] Too many open files

I also notice that the python.exe instance builds up around 5GB ram. Restarting the Kernel releases the memory

I have tried every thing possible on the internet like temp copy, deep copy, using close(), using load() etc.
I have also tried every thing in this issue

> https://github.com/python-pillow/Pillow/issues/2760

![Screenshot 2022-01-07 002627](https://user-images.githubusercontent.com/37607355/148415738-1710bb5e-01dd-4cc8-9958-ba2f14ce36ad.png)




Discussion:
If you didn't have the context manager, I would suggest calling `image.close` - https://pillow.readthedocs.io/en/stable/releasenotes/7.0.0.html#image-del

But you do, so that makes things more interesting.

Is there any way for you to provide us with a self-contained example including images, so that we can run the code and see the error for ourselves?

[self_contained_test.zip](https://github.com/python-pillow/Pillow/files/7826722/self_contained_test.zip)

I tried it without the context manager along with `image.close` but got the same error

In the folder which I have attached, I ran `python change_img_res.py`. After 1014 loops, it gives the following error

![Screenshot 2022-01-07 110955](https://user-images.githubusercontent.com/37607355/148485281-3e47897f-3cdd-405a-90dc-d0069fb0a28d.png)


The zip you've attached is empty?
Apologies, I updated the attachment.

Resolving patch:
diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py
--- a/src/PIL/TiffImagePlugin.py
+++ b/src/PIL/TiffImagePlugin.py
@@ -1234,6 +1234,12 @@ def _load_libtiff(self):
             # UNDONE -- so much for that buffer size thing.
             n, err = decoder.decode(self.fp.read())
 
+        if fp:
+            try:
+                os.close(fp)
+            except OSError:
+                pass
+
         self.tile = []
         self.readonly = 0
 


Test patch: