mirror of
https://github.com/denoland/deno.git
synced 2025-02-07 23:06:50 -05:00
support animated GIF
This commit is contained in:
parent
d255518f97
commit
396c09c24d
3 changed files with 14 additions and 13 deletions
|
@ -14,7 +14,6 @@ use image::codecs::png::PngDecoder;
|
||||||
use image::codecs::webp::WebPDecoder;
|
use image::codecs::webp::WebPDecoder;
|
||||||
use image::imageops::overlay;
|
use image::imageops::overlay;
|
||||||
use image::imageops::FilterType;
|
use image::imageops::FilterType;
|
||||||
use image::AnimationDecoder;
|
|
||||||
use image::ColorType;
|
use image::ColorType;
|
||||||
use image::DynamicImage;
|
use image::DynamicImage;
|
||||||
use image::GenericImageView;
|
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.
|
// 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!(PngDecoder<R>, ImageDecoderFromReaderType);
|
||||||
impl_image_decoder_from_reader!(JpegDecoder<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!(GifDecoder<R>, ImageDecoderFromReaderType);
|
||||||
impl_image_decoder_from_reader!(BmpDecoder<R>, ImageDecoderFromReaderType);
|
impl_image_decoder_from_reader!(BmpDecoder<R>, ImageDecoderFromReaderType);
|
||||||
impl_image_decoder_from_reader!(IcoDecoder<R>, ImageDecoderFromReaderType);
|
impl_image_decoder_from_reader!(IcoDecoder<R>, ImageDecoderFromReaderType);
|
||||||
|
@ -423,18 +423,6 @@ fn decode_bitmap_data(
|
||||||
decoder.to_intermediate_image()?
|
decoder.to_intermediate_image()?
|
||||||
}
|
}
|
||||||
"image/gif" => {
|
"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> =
|
let decoder: GifDecoder<ImageDecoderFromReaderType> =
|
||||||
ImageDecoderFromReader::to_decoder(BufReader::new(Cursor::new(
|
ImageDecoderFromReader::to_decoder(BufReader::new(Cursor::new(
|
||||||
buf,
|
buf,
|
||||||
|
|
BIN
tests/testdata/image/1x1-3f-animated.gif
vendored
Normal file
BIN
tests/testdata/image/1x1-3f-animated.gif
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 126 B |
|
@ -346,4 +346,17 @@ Deno.test(async function imageBitmapFromBlobAnimatedImage() {
|
||||||
// deno-fmt-ignore
|
// deno-fmt-ignore
|
||||||
assertEquals(Deno[Deno.internal].getBitmapData(imageBitmap), new Uint8Array([255, 0, 0, 127]));
|
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]));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue