mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 09:57:43 +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():
 | 
			
		||||
    with Image.open("Tests/images/iss634.gif") as im:
 | 
			
		||||
        expected_rgb_always = im.convert("RGB")
 | 
			
		||||
 | 
			
		||||
    with Image.open("Tests/images/chi.gif") as im:
 | 
			
		||||
        expected_zero = im.convert("RGB")
 | 
			
		||||
        expected_rgb_always_rgba = im.convert("RGBA")
 | 
			
		||||
 | 
			
		||||
        im.seek(1)
 | 
			
		||||
        expected_one = im.convert("RGB")
 | 
			
		||||
        expected_different = im.convert("RGB")
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        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_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.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +112,7 @@ def test_strategy():
 | 
			
		|||
 | 
			
		||||
            im.seek(1)
 | 
			
		||||
            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
 | 
			
		||||
        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._frame_palette = palette or self.global_palette
 | 
			
		||||
        self._frame_transparency = frame_transparency
 | 
			
		||||
        if frame == 0:
 | 
			
		||||
            if self._frame_palette:
 | 
			
		||||
                self.mode = (
 | 
			
		||||
                    "RGB" if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS else "P"
 | 
			
		||||
                )
 | 
			
		||||
                if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
 | 
			
		||||
                    self.mode = "RGBA" if frame_transparency is not None else "RGB"
 | 
			
		||||
                else:
 | 
			
		||||
                    self.mode = "P"
 | 
			
		||||
            else:
 | 
			
		||||
                self.mode = "L"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +315,6 @@ class GifImageFile(ImageFile.ImageFile):
 | 
			
		|||
                palette = copy(self.global_palette)
 | 
			
		||||
            self.palette = palette
 | 
			
		||||
        else:
 | 
			
		||||
            self._frame_transparency = frame_transparency
 | 
			
		||||
            if self.mode == "P":
 | 
			
		||||
                if (
 | 
			
		||||
                    LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY
 | 
			
		||||
| 
						 | 
				
			
			@ -386,7 +387,8 @@ class GifImageFile(ImageFile.ImageFile):
 | 
			
		|||
            transparency = -1
 | 
			
		||||
            if frame_transparency is not None:
 | 
			
		||||
                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"):
 | 
			
		||||
                    transparency = frame_transparency
 | 
			
		||||
            self.tile = [
 | 
			
		||||
| 
						 | 
				
			
			@ -410,9 +412,9 @@ class GifImageFile(ImageFile.ImageFile):
 | 
			
		|||
        temp_mode = "P" if self._frame_palette else "L"
 | 
			
		||||
        self._prev_im = None
 | 
			
		||||
        if self.__frame == 0:
 | 
			
		||||
            if "transparency" in self.info:
 | 
			
		||||
            if self._frame_transparency is not None:
 | 
			
		||||
                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"):
 | 
			
		||||
            self._prev_im = self.im
 | 
			
		||||
| 
						 | 
				
			
			@ -429,8 +431,12 @@ class GifImageFile(ImageFile.ImageFile):
 | 
			
		|||
    def load_end(self):
 | 
			
		||||
        if self.__frame == 0:
 | 
			
		||||
            if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
 | 
			
		||||
                self.mode = "RGB"
 | 
			
		||||
                self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)
 | 
			
		||||
                if self._frame_transparency is not None:
 | 
			
		||||
                    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
 | 
			
		||||
        if self.mode == "P" and self._prev_im:
 | 
			
		||||
            if self._frame_transparency is not None:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user