mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 01:47:47 +03:00 
			
		
		
		
	If first frame has transparency for RGB_ALWAYS, use RGBA
This commit is contained in:
		
							parent
							
								
									b8d96246f7
								
							
						
					
					
						commit
						6663ed929b
					
				| 
						 | 
					@ -84,17 +84,24 @@ def test_l_mode_transparency():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_strategy():
 | 
					def test_strategy():
 | 
				
			||||||
 | 
					    with Image.open("Tests/images/iss634.gif") as im:
 | 
				
			||||||
 | 
					        expected_rgb_always = im.convert("RGB")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with Image.open("Tests/images/chi.gif") as im:
 | 
					    with Image.open("Tests/images/chi.gif") as im:
 | 
				
			||||||
        expected_zero = im.convert("RGB")
 | 
					        expected_rgb_always_rgba = im.convert("RGBA")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        im.seek(1)
 | 
					        im.seek(1)
 | 
				
			||||||
        expected_one = im.convert("RGB")
 | 
					        expected_different = im.convert("RGB")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_ALWAYS
 | 
					        GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_ALWAYS
 | 
				
			||||||
        with Image.open("Tests/images/chi.gif") as im:
 | 
					        with Image.open("Tests/images/iss634.gif") as im:
 | 
				
			||||||
            assert im.mode == "RGB"
 | 
					            assert im.mode == "RGB"
 | 
				
			||||||
            assert_image_equal(im, expected_zero)
 | 
					            assert_image_equal(im, expected_rgb_always)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with Image.open("Tests/images/chi.gif") as im:
 | 
				
			||||||
 | 
					            assert im.mode == "RGBA"
 | 
				
			||||||
 | 
					            assert_image_equal(im, expected_rgb_always_rgba)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GifImagePlugin.LOADING_STRATEGY = (
 | 
					        GifImagePlugin.LOADING_STRATEGY = (
 | 
				
			||||||
            GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
					            GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
				
			||||||
| 
						 | 
					@ -105,7 +112,7 @@ def test_strategy():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            im.seek(1)
 | 
					            im.seek(1)
 | 
				
			||||||
            assert im.mode == "P"
 | 
					            assert im.mode == "P"
 | 
				
			||||||
            assert_image_equal(im.convert("RGB"), expected_one)
 | 
					            assert_image_equal(im.convert("RGB"), expected_different)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Change to RGB mode when a frame has an individual palette
 | 
					        # Change to RGB mode when a frame has an individual palette
 | 
				
			||||||
        with Image.open("Tests/images/iss634.gif") as im:
 | 
					        with Image.open("Tests/images/iss634.gif") as im:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -299,11 +299,13 @@ class GifImageFile(ImageFile.ImageFile):
 | 
				
			||||||
            self.im.paste(self.dispose, self.dispose_extent)
 | 
					            self.im.paste(self.dispose, self.dispose_extent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._frame_palette = palette or self.global_palette
 | 
					        self._frame_palette = palette or self.global_palette
 | 
				
			||||||
 | 
					        self._frame_transparency = frame_transparency
 | 
				
			||||||
        if frame == 0:
 | 
					        if frame == 0:
 | 
				
			||||||
            if self._frame_palette:
 | 
					            if self._frame_palette:
 | 
				
			||||||
                self.mode = (
 | 
					                if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
 | 
				
			||||||
                    "RGB" if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS else "P"
 | 
					                    self.mode = "RGBA" if frame_transparency is not None else "RGB"
 | 
				
			||||||
                )
 | 
					                else:
 | 
				
			||||||
 | 
					                    self.mode = "P"
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self.mode = "L"
 | 
					                self.mode = "L"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -313,7 +315,6 @@ class GifImageFile(ImageFile.ImageFile):
 | 
				
			||||||
                palette = copy(self.global_palette)
 | 
					                palette = copy(self.global_palette)
 | 
				
			||||||
            self.palette = palette
 | 
					            self.palette = palette
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self._frame_transparency = frame_transparency
 | 
					 | 
				
			||||||
            if self.mode == "P":
 | 
					            if self.mode == "P":
 | 
				
			||||||
                if (
 | 
					                if (
 | 
				
			||||||
                    LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
					                    LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
				
			||||||
| 
						 | 
					@ -386,7 +387,8 @@ class GifImageFile(ImageFile.ImageFile):
 | 
				
			||||||
            transparency = -1
 | 
					            transparency = -1
 | 
				
			||||||
            if frame_transparency is not None:
 | 
					            if frame_transparency is not None:
 | 
				
			||||||
                if frame == 0:
 | 
					                if frame == 0:
 | 
				
			||||||
                    self.info["transparency"] = frame_transparency
 | 
					                    if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS:
 | 
				
			||||||
 | 
					                        self.info["transparency"] = frame_transparency
 | 
				
			||||||
                elif self.mode not in ("RGB", "RGBA"):
 | 
					                elif self.mode not in ("RGB", "RGBA"):
 | 
				
			||||||
                    transparency = frame_transparency
 | 
					                    transparency = frame_transparency
 | 
				
			||||||
            self.tile = [
 | 
					            self.tile = [
 | 
				
			||||||
| 
						 | 
					@ -410,9 +412,9 @@ class GifImageFile(ImageFile.ImageFile):
 | 
				
			||||||
        temp_mode = "P" if self._frame_palette else "L"
 | 
					        temp_mode = "P" if self._frame_palette else "L"
 | 
				
			||||||
        self._prev_im = None
 | 
					        self._prev_im = None
 | 
				
			||||||
        if self.__frame == 0:
 | 
					        if self.__frame == 0:
 | 
				
			||||||
            if "transparency" in self.info:
 | 
					            if self._frame_transparency is not None:
 | 
				
			||||||
                self.im = Image.core.fill(
 | 
					                self.im = Image.core.fill(
 | 
				
			||||||
                    temp_mode, self.size, self.info["transparency"]
 | 
					                    temp_mode, self.size, self._frame_transparency
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
        elif self.mode in ("RGB", "RGBA"):
 | 
					        elif self.mode in ("RGB", "RGBA"):
 | 
				
			||||||
            self._prev_im = self.im
 | 
					            self._prev_im = self.im
 | 
				
			||||||
| 
						 | 
					@ -429,8 +431,12 @@ class GifImageFile(ImageFile.ImageFile):
 | 
				
			||||||
    def load_end(self):
 | 
					    def load_end(self):
 | 
				
			||||||
        if self.__frame == 0:
 | 
					        if self.__frame == 0:
 | 
				
			||||||
            if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
 | 
					            if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
 | 
				
			||||||
                self.mode = "RGB"
 | 
					                if self._frame_transparency is not None:
 | 
				
			||||||
                self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
 | 
					                    self.im.putpalettealpha(self._frame_transparency, 0)
 | 
				
			||||||
 | 
					                    self.mode = "RGBA"
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    self.mode = "RGB"
 | 
				
			||||||
 | 
					                self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG)
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        if self.mode == "P" and self._prev_im:
 | 
					        if self.mode == "P" and self._prev_im:
 | 
				
			||||||
            if self._frame_transparency is not None:
 | 
					            if self._frame_transparency is not None:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user