Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 9 additions & 30 deletions src/PIL/GifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@
Image,
ImageChops,
ImageFile,
ImageMath,
ImageOps,
ImagePalette,
ImageSequence,
)
Expand Down Expand Up @@ -735,37 +733,18 @@ def _write_multiple_frames(
pass
if "transparency" in encoderinfo:
# When the delta is zero, fill the image with transparency
diff_frame = im_frame.copy()
fill = Image.new("P", delta.size, encoderinfo["transparency"])
if delta.mode == "RGBA":
# Each pixel is unchanged only if all four bands are zero
r, g, b, a = delta.split()
mask = ImageMath.lambda_eval(
lambda args: args["convert"](
args["max"](
args["max"](
args["max"](args["r"], args["g"]), args["b"]
),
args["a"],
)
* 255,
"1",
),
r=r,
g=g,
b=b,
a=a,
)
else:
if delta.mode == "P":
# Convert to L without considering palette
delta_l = Image.new("L", delta.size)
delta_l.putdata(delta.get_flattened_data())
delta = delta_l
mask = ImageMath.lambda_eval(
lambda args: args["convert"](args["im"] * 255, "1"),
im=delta,
delta = ImageChops.lighter(
ImageChops.lighter(r, g),
ImageChops.lighter(b, a),
)
diff_frame.paste(fill, mask=ImageOps.invert(mask))
# Map zero pixels (palette indices, for "P")
# to a "1" mask without consulting the palette.
unchanged = delta.point([255, *(0,) * 255], "1")
diff_frame = im_frame.copy()
diff_frame.paste(encoderinfo["transparency"], mask=unchanged)
else:
bbox = None
previous_im = im_frame
Expand Down
Loading