Skip to content

Commit aa1fbad

Browse files
committed
Added progress callback to AVIF
1 parent 09e4df1 commit aa1fbad

7 files changed

+62
-23
lines changed

Tests/test_file_apng.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -710,11 +710,9 @@ def test_save_all_progress() -> None:
710710
out = BytesIO()
711711
progress = []
712712

713-
def callback(state):
713+
def callback(state) -> None:
714714
if state["image_filename"]:
715-
state["image_filename"] = (
716-
state["image_filename"].replace("\\", "/").split("Tests/images/")[-1]
717-
)
715+
state["image_filename"] = state["image_filename"].replace("\\", "/")
718716
progress.append(state)
719717

720718
Image.new("RGB", (1, 1)).save(out, "PNG", save_all=True, progress=callback)
@@ -741,7 +739,7 @@ def callback(state):
741739
expected.append(
742740
{
743741
"image_index": i,
744-
"image_filename": "apng/single_frame.png",
742+
"image_filename": "Tests/images/apng/single_frame.png",
745743
"completed_frames": i + 1,
746744
"total_frames": 7,
747745
}
@@ -750,7 +748,7 @@ def callback(state):
750748
expected.append(
751749
{
752750
"image_index": 2,
753-
"image_filename": "apng/delay.png",
751+
"image_filename": "Tests/images/apng/delay.png",
754752
"completed_frames": i + 3,
755753
"total_frames": 7,
756754
}

Tests/test_file_avif.py

+46
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,52 @@ def test_file_pointer_could_be_reused(self) -> None:
217217
with Image.open(blob) as im:
218218
im.load()
219219

220+
def test_save_all_progress(self) -> None:
221+
out = BytesIO()
222+
progress = []
223+
224+
def callback(state) -> None:
225+
if state["image_filename"]:
226+
state["image_filename"] = state["image_filename"].replace("\\", "/")
227+
progress.append(state)
228+
229+
Image.new("RGB", (1, 1)).save(out, "AVIF", save_all=True, progress=callback)
230+
assert progress == [
231+
{
232+
"image_index": 0,
233+
"image_filename": None,
234+
"completed_frames": 1,
235+
"total_frames": 1,
236+
}
237+
]
238+
239+
out = BytesIO()
240+
progress = []
241+
242+
with Image.open("Tests/images/avif/hopper.avif") as im:
243+
im2 = Image.new("RGB", im.size)
244+
im.save(out, "AVIF", save_all=True, append_images=[im2], progress=callback)
245+
246+
expected = []
247+
for i in range(42):
248+
expected.append(
249+
{
250+
"image_index": 0,
251+
"image_filename": "Tests/images/avif/hopper.avif",
252+
"completed_frames": i + 1,
253+
"total_frames": 43,
254+
}
255+
)
256+
expected.append(
257+
{
258+
"image_index": 1,
259+
"image_filename": None,
260+
"completed_frames": 43,
261+
"total_frames": 43,
262+
}
263+
)
264+
assert progress == expected
265+
220266
def test_background_from_gif(self, tmp_path: Path) -> None:
221267
with Image.open("Tests/images/chi.gif") as im:
222268
original_value = im.convert("RGB").getpixel((1, 1))

Tests/test_file_gif.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -296,15 +296,13 @@ def test_roundtrip_save_all_1(tmp_path: Path) -> None:
296296
assert reloaded.getpixel((0, 0)) == 255
297297

298298

299-
def test_save_all_progress():
299+
def test_save_all_progress() -> None:
300300
out = BytesIO()
301301
progress = []
302302

303-
def callback(state):
303+
def callback(state) -> None:
304304
if state["image_filename"]:
305-
state["image_filename"] = (
306-
state["image_filename"].replace("\\", "/").split("Tests/images/")[-1]
307-
)
305+
state["image_filename"] = state["image_filename"].replace("\\", "/")
308306
progress.append(state)
309307

310308
Image.new("RGB", (1, 1)).save(out, "GIF", save_all=True, progress=callback)
@@ -336,7 +334,7 @@ def callback(state):
336334
expected.append(
337335
{
338336
"image_index": 1,
339-
"image_filename": "chi.gif",
337+
"image_filename": "Tests/images/chi.gif",
340338
"completed_frames": i + 2,
341339
"total_frames": 32,
342340
}

Tests/test_file_pdf.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def test_save_all_progress() -> None:
178178
out = BytesIO()
179179
progress = []
180180

181-
def callback(state):
181+
def callback(state) -> None:
182182
if state["image_filename"]:
183183
state["image_filename"] = (
184184
state["image_filename"].replace("\\", "/").split("Tests/images/")[-1]

Tests/test_file_tiff.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ def test_save_all_progress(self) -> None:
797797
out = BytesIO()
798798
progress = []
799799

800-
def callback(state):
800+
def callback(state) -> None:
801801
if state["image_filename"]:
802802
state["image_filename"] = (
803803
state["image_filename"]

Tests/test_file_webp.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,13 @@ def test_unsupported_image_mode(self) -> None:
129129
with pytest.raises(ValueError):
130130
_webp.WebPEncode(im.getim(), False, 0, 0, "", 4, 0, b"", "")
131131

132-
@skip_unless_feature("webp_anim")
133132
def test_save_all_progress(self) -> None:
134133
out = BytesIO()
135134
progress = []
136135

137-
def callback(state):
136+
def callback(state) -> None:
138137
if state["image_filename"]:
139-
state["image_filename"] = (
140-
state["image_filename"]
141-
.replace("\\", "/")
142-
.split("Tests/images/")[-1]
143-
)
138+
state["image_filename"] = state["image_filename"].replace("\\", "/")
144139
progress.append(state)
145140

146141
Image.new("RGB", (1, 1)).save(out, "WEBP", save_all=True, progress=callback)
@@ -165,7 +160,7 @@ def callback(state):
165160
expected.append(
166161
{
167162
"image_index": 0,
168-
"image_filename": "iss634.webp",
163+
"image_filename": "Tests/images/iss634.webp",
169164
"completed_frames": i + 1,
170165
"total_frames": 43,
171166
}

src/PIL/AvifImagePlugin.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,9 @@ def _save(
236236
frame_duration = 0
237237
cur_idx = im.tell()
238238
is_single_frame = total == 1
239+
progress = info.get("progress")
239240
try:
240-
for ims in [im] + append_images:
241+
for i, ims in enumerate([im] + append_images):
241242
# Get number of frames in this image
242243
nfr = getattr(ims, "n_frames", 1)
243244

@@ -268,6 +269,7 @@ def _save(
268269

269270
# Update frame index
270271
frame_idx += 1
272+
im._save_all_progress(progress, ims, i, frame_idx, total)
271273

272274
if not save_all:
273275
break

0 commit comments

Comments
 (0)