internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: python-pillow/Pillow

Issue:
AttributeError: 'PngImageFile' object has no attribute '_PngImageFile__frame'
### What did you do?
My library BentoML is using imageio and Pillow in its tests, and with the latest release of Pillow 7.1.0 half an hour ago, I noticed some existing tests are breaking.

https://github.com/bentoml/BentoML
https://travis-ci.org/github/bentoml/BentoML/jobs/669765333?utm_medium=notification&utm_source=github_status

### What did you expect to happen?
`imageio.imread('./image.png')` should work

### What actually happened?

```
AttributeError: 'PngImageFile' object has no attribute '_PngImageFile__frame'
```
<img width="1043" alt="Screen Shot 2020-04-01 at 9 26 25 AM" src="https://user-images.githubusercontent.com/489344/78161998-18e70400-73fb-11ea-93f4-e210cd4f2636.png">

### What are your OS, Python and Pillow versions?

* OS:  mac os
* Python: 3.75
* Pillow: 7.1.0
* imageio: 2.8.0


```python
from imageio import imread
imread('./test.png')
```
It seems related to https://github.com/python-pillow/Pillow/pull/4243


Discussion:
Git bisect says 67e3ccffeb09903e22c29d737e74070415890ed8 is the first bad commit, from #4243.

```
commit 67e3ccffeb09903e22c29d737e74070415890ed8
Date:   Sun Dec 1 12:50:21 2019 +0900

    Add APNG support

    See #3483

    Adds support for reading APNG files and seeking through frames,
    and adds basic support for writing APNG files.

 src/PIL/PngImagePlugin.py | 401 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 390 insertions(+), 11 deletions(-)
```

@pmrowla Hi, please could you check this? Thank you!

Ping @almarklein from https://github.com/imageio/imageio, FYI.

Resolving patch:
diff --git a/src/PIL/PngImagePlugin.py b/src/PIL/PngImagePlugin.py
--- a/src/PIL/PngImagePlugin.py
+++ b/src/PIL/PngImagePlugin.py
@@ -636,6 +636,7 @@ def _open(self):
         if self.fp.read(8) != _MAGIC:
             raise SyntaxError("not a PNG file")
         self.__fp = self.fp
+        self.__frame = 0
 
         #
         # Parse headers up to the first IDAT or fDAT chunk


Test patch:
diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py
--- a/Tests/test_file_png.py
+++ b/Tests/test_file_png.py
@@ -629,6 +629,14 @@ def test_exif_argument(self, tmp_path):
         with Image.open(test_file) as reloaded:
             assert reloaded.info["exif"] == b"Exif\x00\x00exifstring"
 
+    def test_tell(self, tmp_path):
+        with Image.open(TEST_PNG_FILE) as im:
+            assert im.tell() == 0
+
+    def test_seek(self, tmp_path):
+        with Image.open(TEST_PNG_FILE) as im:
+            im.seek(0)
+
 
 @pytest.mark.skipif(is_win32(), reason="Requires Unix or macOS")
 @skip_unless_feature("zlib")
Repository: python-pillow/Pillow

Issue:
Image.fromarray() cannot handle 1-D arrays
Running Pillow ~~7.0.0~~ (EDIT: now 7.1.2) on Python 3.7.6 on Windows 10 x64

I am converting a float32 grayscale array to Pillow so that I can use some of the image operations. This is not strictly an actual image and I want to preserve the order of the grayscale values. Having to reshape the array to use these operations doesn't seem intended. The grayscale values are stored in index 3 of the dataset. When I try to load the array into the Pillow Image class, it throws an error because `__array_interface__['shape'][1]` is missing on a 1-D array. This is the Numpy intended behavior (see https://numpy.org/doc/stable/reference/generated/numpy.ndarray.shape.html). There is no check for this in `Image.fromarray()`.

Relevant code:
```python
rows = np.loadtxt (f, dtype = int, max_rows = 1)
columns = np.loadtxt (f, dtype = int, max_rows = 1)
inputPoints = np.loadtxt (f, delimiter=' ', max_rows = (rows * columns))
testArray = 255 * inputPoints[:,3]
print (testArray.__array_interface__)
print (len (testArray.__array_interface__['shape']))
grayImage = Image.fromarray (testArray, mode = 'L')
```

Output:

```python
{'data': (2080565403600, False), 'strides': None, 'descr': [('', '<f8')], 'typestr': '<f8', 'shape': (29118,), 'version': 3}
1
Traceback (most recent call last):
  File ".\test.py", line 333, in <module>
    grayImage = Image.fromarray (testArray, mode = 'L')
  File "D:\ProgramData\Anaconda3\envs\vtkvista37env\lib\site-packages\PIL\Image.py", line 2694, in fromarray
    size = shape[1], shape[0]
IndexError: tuple index out of range
```

Context in Image.py:

```python
    arr = obj.__array_interface__
    shape = arr["shape"]
    ndim = len(shape)
    strides = arr.get("strides", None)

    [some code for mode and dimensions]

    size = shape[1], shape[0]
```

I might suggest something like:

```python
    size = 1 if ndim == 1 else shape[1],  shape[0]
```

Thank you!



Discussion:

Resolving patch:
diff --git a/src/PIL/Image.py b/src/PIL/Image.py
--- a/src/PIL/Image.py
+++ b/src/PIL/Image.py
@@ -2727,7 +2727,7 @@ def fromarray(obj, mode=None):
     if ndim > ndmax:
         raise ValueError("Too many dimensions: %d > %d." % (ndim, ndmax))
 
-    size = shape[1], shape[0]
+    size = 1 if ndim == 1 else shape[1], shape[0]
     if strides is not None:
         if hasattr(obj, "tobytes"):
             obj = obj.tobytes()


Test patch:
diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py
--- a/Tests/test_numpy.py
+++ b/Tests/test_numpy.py
@@ -89,6 +89,11 @@ def test_3d_array():
     assert_image(Image.fromarray(a[:, :, 1]), "L", TEST_IMAGE_SIZE)
 
 
+def test_1d_array():
+    a = numpy.ones(5, dtype=numpy.uint8)
+    assert_image(Image.fromarray(a), "L", (1, 5))
+
+
 def _test_img_equals_nparray(img, np):
     assert len(np.shape) >= 2
     np_size = np.shape[1], np.shape[0]
Repository: python-pillow/Pillow

Issue:
Division by zero when creating a thumbnail
Hi,
Sorry if this as already been reported, but when trying to create a thumbnail (80, 80) from an image (550, 5)  I get a divide by zero 

```python
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python38\lib\site-packages\PIL\Image.py", line 2279, in thumbnail
    y = round_aspect(x / aspect, key=lambda n: abs(aspect - x / n))
  File "C:\Python38\lib\site-packages\PIL\Image.py", line 2272, in round_aspect
    return max(min(math.floor(number), math.ceil(number), key=key), 1)
  File "C:\Python38\lib\site-packages\PIL\Image.py", line 2279, in <lambda>
    y = round_aspect(x / aspect, key=lambda n: abs(aspect - x / n))
ZeroDivisionError: division by zero
```
It looks like the key (n) can be be zero so perhaps the code needs to test for it?

Tim



Discussion:
The relevant code is checking whether it is better to round up or down to better match the image's aspect ratio. In this case, because of the dimensions of the image, rounding down gives a size of 0. The outer max is supposed to take care of it, but the division is failing first.

Therefore I would modify `round_aspect` as:

```python
        def round_aspect(number, key):
+            if number < 1:
+                return 1
+            return min(math.floor(number), math.ceil(number), key=key)
-            return max(min(math.floor(number), math.ceil(number), key=key), 1)
```

Resolving patch:
diff --git a/src/PIL/Image.py b/src/PIL/Image.py
--- a/src/PIL/Image.py
+++ b/src/PIL/Image.py
@@ -2277,7 +2277,9 @@ def round_aspect(number, key):
         if x / y >= aspect:
             x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y))
         else:
-            y = round_aspect(x / aspect, key=lambda n: abs(aspect - x / n))
+            y = round_aspect(
+                x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n)
+            )
         size = (x, y)
 
         box = None


Test patch:
diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py
--- a/Tests/test_image_thumbnail.py
+++ b/Tests/test_image_thumbnail.py
@@ -63,6 +63,12 @@ def test_aspect():
     assert im.size == (75, 23)  # ratio is 3.260869565217
 
 
+def test_division_by_zero():
+    im = Image.new("L", (200, 2))
+    im.thumbnail((75, 75))
+    assert im.size == (75, 1)
+
+
 def test_float():
     im = Image.new("L", (128, 128))
     im.thumbnail((99.9, 99.9))
Repository: python-pillow/Pillow

Issue:
BLP1 files are not handled
### What did you do?
I tried to open a BLP1 file
### What did you expect to happen?
I expected to see the image
### What actually happened?
I saw a black square
### What are your OS, Python and Pillow versions?

* OS: Windows10 x64
* Python: 3.7
* Pillow: 7.2

You first need a blp1 picture, I think it is a proprietary format so i'm not sure I can put one here
To easily get one go on https://www.epicwar.com, download a map then open it with a MPQ viewer, every map has a thumbnail in the blp1 format.
```python
from PIL import Image
with Image.open("file.blp") as pil:
    convert = pil.convert('RGB')
    convert.show()
    convert.save((work_folder / name).with_suffix('.jpg'))
```


Discussion:

Resolving patch:
diff --git a/src/PIL/BlpImagePlugin.py b/src/PIL/BlpImagePlugin.py
--- a/src/PIL/BlpImagePlugin.py
+++ b/src/PIL/BlpImagePlugin.py
@@ -357,9 +357,9 @@ def _decode_jpeg_stream(self):
         data = BytesIO(data)
         image = JpegImageFile(data)
         Image._decompression_bomb_check(image.size)
-        self.tile = image.tile  # :/
-        self.fd = image.fp
-        self.mode = image.mode
+        image.mode = "RGB"
+        image.tile = [("jpeg", (0, 0) + self.size, 0, ("BGRX", ""))]
+        self.set_as_raw(image.tobytes())
 
 
 class BLP2Decoder(_BLPBaseDecoder):


Test patch:
diff --git a/Tests/images/blp/blp1_jpeg.png b/Tests/images/blp/blp1_jpeg.png
new file mode 100644
Binary files /dev/null and b/Tests/images/blp/blp1_jpeg.png differ
diff --git a/Tests/test_file_blp.py b/Tests/test_file_blp.py
--- a/Tests/test_file_blp.py
+++ b/Tests/test_file_blp.py
@@ -5,6 +5,11 @@
 from .helper import assert_image_equal_tofile
 
 
+def test_load_blp1():
+    with Image.open("Tests/images/blp/blp1_jpeg.blp") as im:
+        assert_image_equal_tofile(im, "Tests/images/blp/blp1_jpeg.png")
+
+
 def test_load_blp2_raw():
     with Image.open("Tests/images/blp/blp2_raw.blp") as im:
         assert_image_equal_tofile(im, "Tests/images/blp/blp2_raw.png")
Repository: python-pillow/Pillow

Issue:
CalledProcessError saving icns file to io.BytesIO()
Currently, writing an icns file to an io.ByteIO object fails. This operation is supported by other filetypes (jpg, png, ico, etc) so I'm not clear if this report falls under feature request or bug

### What did you do?
Write icns file to io.BytesIO() object
```python
from PIL import Image
import io
import base64

im = Image.new(mode="RGBA", size=(256,256), color=(0,100,246,255))
f = io.BytesIO()
im.save(fp=f, format="icns")

b64 = base64.b64encode(f.getvalue()).decode()
print(f'Image: {b64}')
```

### What did you expect to happen?
Fill the io.BytesIO object 

### What actually happened?
macOS's iconutil failed because it was provided an empty filename for output (-o)
```bash
subprocess.CalledProcessError: Command '['iconutil', '-c', 'icns', '-o', '', '/var/folders/91/q75bkgks1196cr1rsr0399540000gn/T/tmppmsm3z2y.iconset']' returned non-zero exit status 1.
```

I believe one solution would be if `filename` variable is empty then use a dummy name and after popen returns, read the file from disk.

### What are your OS, Python and Pillow versions?

* OS: macOS Mojave 10.14.6
* Python: 3.7.7
* Pillow: 7.1.2


Discussion:
This would be fixed by merging #4526.

Resolving patch:
diff --git a/src/PIL/IcnsImagePlugin.py b/src/PIL/IcnsImagePlugin.py
--- a/src/PIL/IcnsImagePlugin.py
+++ b/src/PIL/IcnsImagePlugin.py
@@ -337,6 +337,10 @@ def _save(im, fp, filename):
 
         # iconutil -c icns -o {} {}
 
+        fp_only = not filename
+        if fp_only:
+            f, filename = tempfile.mkstemp(".icns")
+            os.close(f)
         convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset]
         convert_proc = subprocess.Popen(
             convert_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL
@@ -349,6 +353,10 @@ def _save(im, fp, filename):
         if retcode:
             raise subprocess.CalledProcessError(retcode, convert_cmd)
 
+        if fp_only:
+            with open(filename, "rb") as f:
+                fp.write(f.read())
+
 
 Image.register_open(IcnsImageFile.format, IcnsImageFile, lambda x: x[:4] == b"icns")
 Image.register_extension(IcnsImageFile.format, ".icns")


Test patch:
diff --git a/Tests/test_file_icns.py b/Tests/test_file_icns.py
--- a/Tests/test_file_icns.py
+++ b/Tests/test_file_icns.py
@@ -55,6 +55,19 @@ def test_save_append_images(tmp_path):
             assert_image_equal(reread, provided_im)
 
 
+@pytest.mark.skipif(sys.platform != "darwin", reason="Requires macOS")
+def test_save_fp():
+    fp = io.BytesIO()
+
+    with Image.open(TEST_FILE) as im:
+        im.save(fp, format="ICNS")
+
+    with Image.open(fp) as reread:
+        assert reread.mode == "RGBA"
+        assert reread.size == (1024, 1024)
+        assert reread.format == "ICNS"
+
+
 def test_sizes():
     # Check that we can load all of the sizes, and that the final pixel
     # dimensions are as expected
Repository: python-pillow/Pillow

Issue:
PSD Plugin does not register a MIME type
The [`PSDImagePlugin`](https://github.com/python-pillow/Pillow/blob/master/src/PIL/PsdImagePlugin.py) does not register a MIME type as I'd expect it to. The correct MIME for PSD images, according to IANA, is ["image/vnd.adobe.photoshop"](https://www.iana.org/assignments/media-types/image/vnd.adobe.photoshop).

Is there a reason this isn't registered?
PSD Plugin does not register a MIME type
The [`PSDImagePlugin`](https://github.com/python-pillow/Pillow/blob/master/src/PIL/PsdImagePlugin.py) does not register a MIME type as I'd expect it to. The correct MIME for PSD images, according to IANA, is ["image/vnd.adobe.photoshop"](https://www.iana.org/assignments/media-types/image/vnd.adobe.photoshop).

Is there a reason this isn't registered?


Discussion:

Resolving patch:
diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py
--- a/src/PIL/PsdImagePlugin.py
+++ b/src/PIL/PsdImagePlugin.py
@@ -307,3 +307,5 @@ def _maketile(file, mode, bbox, channels):
 Image.register_open(PsdImageFile.format, PsdImageFile, _accept)
 
 Image.register_extension(PsdImageFile.format, ".psd")
+
+Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop")


Test patch:
diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py
--- a/Tests/test_file_psd.py
+++ b/Tests/test_file_psd.py
@@ -12,6 +12,7 @@ def test_sanity():
         assert im.mode == "RGB"
         assert im.size == (128, 128)
         assert im.format == "PSD"
+        assert im.get_format_mimetype() == "image/vnd.adobe.photoshop"
 
         im2 = hopper()
         assert_image_similar(im, im2, 4.8)
Repository: python-pillow/Pillow

Issue:
EpsImagePlugin logs "Error closing: 'NoneType' object has no attribute 'close'"
### What did you do?
```python
import io, logging, PIL.Image
img = PIL.Image.open(io.BytesIO(b"%!PS-Adobe-3.0 EPSF-3.0\n%%BoundingBox:   36   36  576  756\n"))
img.load()
```

(GhostScript must be in PATH)

### What did you expect to happen?

Nothing.

### What actually happened?

`DEBUG:PIL.Image:Error closing: 'NoneType' object has no attribute 'close'`

### What are your OS, Python and Pillow versions?

* OS: Windows 10
* Python: Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
* Pillow: 7.2.0

### What causes the problem?
Here: https://github.com/python-pillow/Pillow/blob/893489c57227f76cff8816de167ad329e5862756/src/PIL/EpsImagePlugin.py#L155 `Ghostscript()` calls `out_im.close()` but `out_im.load()` was already called here: https://github.com/python-pillow/Pillow/blob/893489c57227f76cff8816de167ad329e5862756/src/PIL/EpsImagePlugin.py#L145, so `Image.close()` encounters `self.fp == None`


Discussion:

Resolving patch:
diff --git a/src/PIL/Image.py b/src/PIL/Image.py
--- a/src/PIL/Image.py
+++ b/src/PIL/Image.py
@@ -594,7 +594,8 @@ def close(self):
         try:
             if hasattr(self, "_close__fp"):
                 self._close__fp()
-            self.fp.close()
+            if self.fp:
+                self.fp.close()
             self.fp = None
         except Exception as msg:
             logger.debug("Error closing: %s", msg)


Test patch:
diff --git a/Tests/test_image_load.py b/Tests/test_image_load.py
--- a/Tests/test_image_load.py
+++ b/Tests/test_image_load.py
@@ -1,3 +1,4 @@
+import logging
 import os
 
 import pytest
@@ -23,6 +24,14 @@ def test_close():
         im.getpixel((0, 0))
 
 
+def test_close_after_load(caplog):
+    im = Image.open("Tests/images/hopper.gif")
+    im.load()
+    with caplog.at_level(logging.DEBUG):
+        im.close()
+    assert len(caplog.records) == 0
+
+
 def test_contextmanager():
     fn = None
     with Image.open("Tests/images/hopper.gif") as im:
Repository: python-pillow/Pillow

Issue:
Why does Pillow invert the color of a CMYK image when converting to PDF?


### What did you do?
Using PIL to open a JPEG(CMYK) and then save it as PDF

### What did you expect to happen?
A PDF with CMYK image.

### What actually happened?
A PDF with CMYK image but the colors are inverted. 

### What are your OS, Python and Pillow versions?

* OS: Mac OS V 10.15.6
* Python: 3.7.6 
* Pillow: 6.2.2

```python
from PIL import Image, ImageOps

image = Image.open('door.jpg')
image.save(
  'output.pdf',
  resolution=180.0,
  quality=100
)
```

input and output image
![i7PYq](https://user-images.githubusercontent.com/2227036/90120460-0e4e5b00-dd5b-11ea-88bf-3d0df3b2d6c2.jpg)

Note: I tried converting the image to RGB prior to saving it as PDF and it works as intended. But since the PDF is meant for printing purpose, I need the image to be in CMYK.

Since I did not get an answer on Stackoverflow and it does seem like either a limitation in Pillow or perhaps not documented, i'm creating a ticket here. 


Discussion:
For reference, the Stack Overflow question:

* https://stackoverflow.com/q/63237829/724176

Resolving patch:
diff --git a/src/PIL/PdfImagePlugin.py b/src/PIL/PdfImagePlugin.py
--- a/src/PIL/PdfImagePlugin.py
+++ b/src/PIL/PdfImagePlugin.py
@@ -121,6 +121,7 @@ def _save(im, fp, filename, save_all=False):
 
             bits = 8
             params = None
+            decode = None
 
             if im.mode == "1":
                 filter = "ASCIIHexDecode"
@@ -150,6 +151,7 @@ def _save(im, fp, filename, save_all=False):
                 filter = "DCTDecode"
                 colorspace = PdfParser.PdfName("DeviceCMYK")
                 procset = "ImageC"  # color images
+                decode = [1, 0, 1, 0, 1, 0, 1, 0]
             else:
                 raise ValueError("cannot save mode %s" % im.mode)
 
@@ -189,6 +191,7 @@ def _save(im, fp, filename, save_all=False):
                 Height=height,  # * 72.0 / resolution,
                 Filter=PdfParser.PdfName(filter),
                 BitsPerComponent=bits,
+                Decode=decode,
                 DecodeParams=params,
                 ColorSpace=colorspace,
             )


Test patch:
Repository: python-pillow/Pillow

Issue:
Unpopular `formats` argument of `PIL.Image.open` cause exceptions
In `open()`, `preinit()`  only initialize popular formats, 
`_open_core()` will raise if the  given  formats have not been initialized. The `init()` failback become unreachable. 
https://github.com/python-pillow/Pillow/blob/2d6e51e26c7683f067d29bd69f4fdf8eef003643/src/PIL/Image.py#L2901-L2934

### What did you do?

```python
from __future__ import annotations

from PIL import Image


def main():
    with open('any.webp', 'rb') as f:
        try:
            im = Image.open(f, formats=('WEBP',))
        except Exception:
            print(Image.ID)  # No WEBP in the list
            raise
        else:
            print(im.size)


if __name__ == '__main__':
    main()

```

### What did you expect to happen?
Output the size
```console
(640, 480)
```

### What actually happened?
```console
['BMP', 'DIB', 'GIF', 'TIFF', 'JPEG', 'PPM', 'PNG']
Traceback (most recent call last):
  File "pil_debug.py", line 18, in <module>
    main()
  File "pil_debug.py", line 9, in main
    im = Image.open(f, formats=('WEBP',))
  File "lib\site-packages\PIL\Image.py", line 2929, in open
    im = _open_core(fp, filename, prefix, formats)
  File "lib\site-packages\PIL\Image.py", line 2909, in _open_core
    factory, accept = OPEN[i]
KeyError: 'WEBP'
```

### What are your OS, Python and Pillow versions?

* OS: Windows 10
* Python: 3.8
* Pillow: 8.0.1




Discussion:
You can import the WebP plugin explicitly to make sure it is loaded:
```python
from PIL import Image, WebPImagePlugin
im = Image.open("Downloads/1.webp", formats=("WEBP",))
# im = <PIL.WebPImagePlugin.WebPImageFile image mode=RGB size=550x368 at 0x233A9546508>
```

Resolving patch:
diff --git a/src/PIL/Image.py b/src/PIL/Image.py
--- a/src/PIL/Image.py
+++ b/src/PIL/Image.py
@@ -2905,6 +2905,8 @@ def open(fp, mode="r", formats=None):
 
     def _open_core(fp, filename, prefix, formats):
         for i in formats:
+            if i not in OPEN:
+                init()
             try:
                 factory, accept = OPEN[i]
                 result = not accept or accept(prefix)


Test patch:
Repository: python-pillow/Pillow

Issue:
Docs: add logo to menu
We can add the Pillow logo to the docs menu:

> **`html_logo`**
> If given, this must be the name of an image file (path relative to the configuration directory) that is the logo of the docs. It is placed at the top of the sidebar; its width should therefore not exceed 200 pixels. Default: `None`.

https://www.sphinx-doc.org/en/master/usage/configuration.html

Here's a couple of options: one with the logo, another with logo+text.

Which do you prefer?


| https://pillow-hugovk.readthedocs.io/en/docs-logo/ | https://pillow-hugovk.readthedocs.io/en/docs-logo-text/ |
|:-:|:-:|
| https://github.com/hugovk/Pillow/tree/docs-logo | https://github.com/hugovk/Pillow/tree/docs-logo-text |
| ![image](https://user-images.githubusercontent.com/1324225/99886210-64c51280-2c43-11eb-89de-c576a22115ae.png) | ![image](https://user-images.githubusercontent.com/1324225/99886219-7c9c9680-2c43-11eb-94d6-1ce0e740904c.png) |
| ![image](https://user-images.githubusercontent.com/1324225/99886301-1a906100-2c44-11eb-864d-f05be3b75703.png) | ![image](https://user-images.githubusercontent.com/1324225/99886242-90e09380-2c43-11eb-964a-fd8b4429b00d.png) |
| ![Screenshot_20201121-220557_Chrome](https://user-images.githubusercontent.com/1324225/99886569-3b59b600-2c46-11eb-8c13-7b176bd3d6db.jpg) | ![Screenshot_20201121-220617_Chrome](https://user-images.githubusercontent.com/1324225/99886570-3c8ae300-2c46-11eb-8dd2-a8fa05140cab.jpg) |
| ![Screenshot_20201121-220825_Chrome](https://user-images.githubusercontent.com/1324225/99886572-3d237980-2c46-11eb-9f60-920e8c1eee6d.jpg) | ![Screenshot_20201121-220834_Chrome](https://user-images.githubusercontent.com/1324225/99886573-3d237980-2c46-11eb-8edd-6e76858d5248.jpg) |




Discussion:
My preference is for logo+text. Logo by itself seems rather large.

Resolving patch:
diff --git a/docs/conf.py b/docs/conf.py
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -143,7 +143,7 @@
 
 # The name of an image file (relative to this directory) to place at the top
 # of the sidebar.
-# html_logo = None
+html_logo = "resources/pillow-logo.png"
 
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32


Test patch: