diff --git a/packages/jimp/test/filetypes.test.js b/packages/jimp/test/filetypes.test.js index 1c67245a4..ffdb63776 100644 --- a/packages/jimp/test/filetypes.test.js +++ b/packages/jimp/test/filetypes.test.js @@ -36,6 +36,13 @@ describe('FileType', () => { image.getMIME().should.be.equal(clone.getMIME()); }); + + it('clones gif with the correct MIME type', async () => { + const image = await Jimp.read(imagesDir + '/flower.gif'); + const clone = image.clone(); + + image.getMIME().should.be.equal(clone.getMIME()); + }); }); describe('hasAlpha', () => { diff --git a/packages/jimp/test/images/flower.gif b/packages/jimp/test/images/flower.gif new file mode 100644 index 000000000..d4bd4a524 Binary files /dev/null and b/packages/jimp/test/images/flower.gif differ diff --git a/packages/type-gif/package.json b/packages/type-gif/package.json index 0b0b2cd5b..bf37d02d8 100644 --- a/packages/type-gif/package.json +++ b/packages/type-gif/package.json @@ -19,6 +19,7 @@ "dependencies": { "@babel/runtime": "^7.7.2", "@jimp/utils": "link:../utils", + "gifwrap": "^0.9.2", "omggif": "^1.0.9" }, "peerDependencies": { diff --git a/packages/type-gif/src/index.js b/packages/type-gif/src/index.js index 373838232..5ef769431 100644 --- a/packages/type-gif/src/index.js +++ b/packages/type-gif/src/index.js @@ -1,4 +1,5 @@ import GIF from 'omggif'; +import { GifUtil, GifFrame, BitmapImage, GifCodec } from 'gifwrap'; const MIME_TYPE = 'image/gif'; @@ -22,5 +23,17 @@ export default () => ({ height: gifObj.height }; } + }, + + encoders: { + [MIME_TYPE]: data => { + const bitmap = new BitmapImage(data.bitmap); + GifUtil.quantizeDekker(bitmap, 256); + const newFrame = new GifFrame(bitmap); + const gifCodec = new GifCodec(); + return gifCodec.encodeGif([newFrame], {}).then(newGif => { + return newGif.buffer; + }); + } } }); diff --git a/packages/type-gif/test/gif.test.js b/packages/type-gif/test/gif.test.js new file mode 100644 index 000000000..100d7a5d4 --- /dev/null +++ b/packages/type-gif/test/gif.test.js @@ -0,0 +1,29 @@ +import { Jimp, getTestDir } from '@jimp/test-utils'; +import configure from '@jimp/custom'; + +import gif from '../src'; + +const jimp = configure({ types: [gif] }, Jimp); + +describe('GIF', () => { + const imagesDir = getTestDir(__dirname) + '/images'; + + it('load GIF', async () => { + const image = await jimp.read(imagesDir + '/flower.gif'); + image.getPixelColor(10, 10).should.be.equal(0xe5e6d9ff); + }); + + it('load animated GIF', async () => { + const image = await jimp.read(imagesDir + '/animated.gif'); + image.getPixelColor(10, 10).should.be.equal(0xa1d2f1ff); + }); + + it('export GIF', async () => { + const jgd = await jimp.read(imagesDir + '/flower.gif'); + const buffer = await jgd.getBufferAsync('image/gif'); + buffer + .toString() + .startsWith('GIF') + .should.be.equal(true); + }); +}); diff --git a/packages/type-gif/test/images/animated.gif b/packages/type-gif/test/images/animated.gif new file mode 100644 index 000000000..401ef84a9 Binary files /dev/null and b/packages/type-gif/test/images/animated.gif differ diff --git a/packages/type-gif/test/images/flower.gif b/packages/type-gif/test/images/flower.gif new file mode 100644 index 000000000..23595dd56 Binary files /dev/null and b/packages/type-gif/test/images/flower.gif differ