0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 12:16:11 -05:00

support animated GIF

This commit is contained in:
Hajime-san 2024-08-30 14:00:05 +09:00
parent d255518f97
commit 396c09c24d
3 changed files with 14 additions and 13 deletions

View file

@ -14,7 +14,6 @@ use image::codecs::png::PngDecoder;
use image::codecs::webp::WebPDecoder;
use image::imageops::overlay;
use image::imageops::FilterType;
use image::AnimationDecoder;
use image::ColorType;
use image::DynamicImage;
use image::GenericImageView;
@ -391,6 +390,7 @@ macro_rules! impl_image_decoder_from_reader {
// If PngDecoder decodes an animated image, it returns the default image if one is set, or the first frame if not.
impl_image_decoder_from_reader!(PngDecoder<R>, ImageDecoderFromReaderType);
impl_image_decoder_from_reader!(JpegDecoder<R>, ImageDecoderFromReaderType);
// The GifDecoder decodes the first frame.
impl_image_decoder_from_reader!(GifDecoder<R>, ImageDecoderFromReaderType);
impl_image_decoder_from_reader!(BmpDecoder<R>, ImageDecoderFromReaderType);
impl_image_decoder_from_reader!(IcoDecoder<R>, ImageDecoderFromReaderType);
@ -423,18 +423,6 @@ fn decode_bitmap_data(
decoder.to_intermediate_image()?
}
"image/gif" => {
let decoder: GifDecoder<ImageDecoderFromReaderType> =
ImageDecoderFromReader::to_decoder(BufReader::new(Cursor::new(
buf,
)))?;
if decoder.into_frames().count() > 1 {
return Err(
DOMExceptionInvalidStateError::new(
"Animation image is not supported.",
)
.into(),
);
}
let decoder: GifDecoder<ImageDecoderFromReaderType> =
ImageDecoderFromReader::to_decoder(BufReader::new(Cursor::new(
buf,

BIN
tests/testdata/image/1x1-3f-animated.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

View file

@ -346,4 +346,17 @@ Deno.test(async function imageBitmapFromBlobAnimatedImage() {
// deno-fmt-ignore
assertEquals(Deno[Deno.internal].getBitmapData(imageBitmap), new Uint8Array([255, 0, 0, 127]));
}
{
// the chunk of animated gif is below (3 frames, 1x1, 8-bit, RGBA)
// [ 255, 0, 0, 255,
// 0, 255, 0, 255,
// 0, 0, 255, 255 ]
const imageData = new Blob([
await Deno.readFile(`${prefix}/1x1-3f-animated.gif`),
], { type: "image/gif" });
const imageBitmap = await createImageBitmap(imageData);
// @ts-ignore: Deno[Deno.internal].core allowed
// deno-fmt-ignore
assertEquals(Deno[Deno.internal].getBitmapData(imageBitmap), new Uint8Array([255, 0, 0, 255]));
}
});