Repository: python-pillow/Pillow

Issue:
AnimGIF not transparent
The frames of the down below animated GIF are not transparent (first frame works).

Testcase:
````python
import base64, io
import PIL.Image

animgif = '''
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'''

with PIL.Image.open(io.BytesIO(base64.b64decode(animgif)), 'r') as img:
    for index, frame in enumerate(PIL.ImageSequence.Iterator(img)):
        img.save('/tmp/not-transparent-'+str(index)+'.png', 'PNG')
````


Discussion:
Experimenting, I find that prioritising the global transparency over frame transparency when replacing with background color fixes this.

```diff
diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py
index db6944267..128afc428 100644
--- a/src/PIL/GifImagePlugin.py
+++ b/src/PIL/GifImagePlugin.py
@@ -271,11 +271,9 @@ class GifImageFile(ImageFile.ImageFile):
                 Image._decompression_bomb_check(dispose_size)
 
                 # by convention, attempt to use transparency first
-                color = (
-                    frame_transparency
-                    if frame_transparency is not None
-                    else self.info.get("background", 0)
-                )
+                color = self.info.get("transparency", frame_transparency)
+                if color is None:
+                    color = self.info.get("background", 0)
                 self.dispose = Image.core.fill("P", dispose_size, color)
             else:
                 # replace with previous contents
```

Is the image data that you've provided able to be included as part of our test suite, and distributed under our Pillow license?
@radarhere 
Thanks a lot for all your efforts.
Yes, the GIF image is license free (created in house).


Resolving patch:
diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py
--- a/src/PIL/GifImagePlugin.py
+++ b/src/PIL/GifImagePlugin.py
@@ -271,11 +271,9 @@ def _seek(self, frame):
                 Image._decompression_bomb_check(dispose_size)
 
                 # by convention, attempt to use transparency first
-                color = (
-                    frame_transparency
-                    if frame_transparency is not None
-                    else self.info.get("background", 0)
-                )
+                color = self.info.get("transparency", frame_transparency)
+                if color is None:
+                    color = self.info.get("background", 0)
                 self.dispose = Image.core.fill("P", dispose_size, color)
             else:
                 # replace with previous contents


Test patch:
diff --git a/Tests/images/dispose_bgnd_transparency.gif b/Tests/images/dispose_bgnd_transparency.gif
new file mode 100644
Binary files /dev/null and b/Tests/images/dispose_bgnd_transparency.gif differ
diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py
--- a/Tests/test_file_gif.py
+++ b/Tests/test_file_gif.py
@@ -337,6 +337,13 @@ def test_dispose_background():
             pass
 
 
+def test_dispose_background_transparency():
+    with Image.open("Tests/images/dispose_bgnd_transparency.gif") as img:
+        img.seek(2)
+        px = img.convert("RGBA").load()
+        assert px[35, 30][3] == 0
+
+
 def test_transparent_dispose():
     expected_colors = [(2, 1, 2), (0, 1, 0), (2, 1, 2)]
     with Image.open("Tests/images/transparent_dispose.gif") as img: