mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 01:47:47 +03:00 
			
		
		
		
	Only crop when saving with disposal method 2 if transparency is present
This commit is contained in:
		
							parent
							
								
									3c2310e090
								
							
						
					
					
						commit
						8f4bfe1fe5
					
				| 
						 | 
				
			
			@ -762,6 +762,21 @@ def test_dispose2_previous_frame(tmp_path: Path) -> None:
 | 
			
		|||
        assert im.getpixel((0, 0)) == (0, 0, 0, 255)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_dispose2_without_transparency(tmp_path: Path) -> None:
 | 
			
		||||
    out = str(tmp_path / "temp.gif")
 | 
			
		||||
 | 
			
		||||
    im = Image.new("P", (100, 100))
 | 
			
		||||
 | 
			
		||||
    im2 = Image.new("P", (100, 100), (0, 0, 0))
 | 
			
		||||
    im2.putpixel((50, 50), (255, 0, 0))
 | 
			
		||||
 | 
			
		||||
    im.save(out, save_all=True, append_images=[im2], disposal=2)
 | 
			
		||||
 | 
			
		||||
    with Image.open(out) as reloaded:
 | 
			
		||||
        reloaded.seek(1)
 | 
			
		||||
        assert reloaded.tile[0].extents == (0, 0, 100, 100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_transparency_in_second_frame(tmp_path: Path) -> None:
 | 
			
		||||
    out = str(tmp_path / "temp.gif")
 | 
			
		||||
    with Image.open("Tests/images/different_transparency.gif") as im:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -689,16 +689,21 @@ def _write_multiple_frames(
 | 
			
		|||
                        im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"]
 | 
			
		||||
                    continue
 | 
			
		||||
                if im_frames[-1].encoderinfo.get("disposal") == 2:
 | 
			
		||||
                    if background_im is None:
 | 
			
		||||
                    # To appear correctly in viewers using a convention,
 | 
			
		||||
                    # only consider transparency, and not background color
 | 
			
		||||
                    color = im.encoderinfo.get(
 | 
			
		||||
                            "transparency", im.info.get("transparency", (0, 0, 0))
 | 
			
		||||
                        "transparency", im.info.get("transparency")
 | 
			
		||||
                    )
 | 
			
		||||
                    if color is not None:
 | 
			
		||||
                        if background_im is None:
 | 
			
		||||
                            background = _get_background(im_frame, color)
 | 
			
		||||
                            background_im = Image.new("P", im_frame.size, background)
 | 
			
		||||
                            first_palette = im_frames[0].im.palette
 | 
			
		||||
                            assert first_palette is not None
 | 
			
		||||
                            background_im.putpalette(first_palette, first_palette.mode)
 | 
			
		||||
                        bbox = _getbbox(background_im, im_frame)[1]
 | 
			
		||||
                    else:
 | 
			
		||||
                        bbox = (0, 0) + im_frame.size
 | 
			
		||||
                elif encoderinfo.get("optimize") and im_frame.mode != "1":
 | 
			
		||||
                    if "transparency" not in encoderinfo:
 | 
			
		||||
                        assert im_frame.palette is not None
 | 
			
		||||
| 
						 | 
				
			
			@ -764,6 +769,7 @@ def _write_multiple_frames(
 | 
			
		|||
            if not palette:
 | 
			
		||||
                frame_data.encoderinfo["include_color_table"] = True
 | 
			
		||||
 | 
			
		||||
            if frame_data.bbox != (0, 0) + im_frame.size:
 | 
			
		||||
                im_frame = im_frame.crop(frame_data.bbox)
 | 
			
		||||
            offset = frame_data.bbox[:2]
 | 
			
		||||
        _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user