Manipulação pura de imagem JavaScript

eu tenho um caso de uso, onde eu quero criado (a) um Nó de aplicação (b) executa básica manipulações de imagem (PNG redimensionar e recortar), mas (c), onde eu não posso ter de dependências externas, como bibliotecas nativas, GraphicsMagick, ImageMagick, PhantonJS, Inkscape, etc.

Tudo tem de ser feito em JavaScript puro.

Dado o quão simples a manipulação que quero fazer é (apenas dimensionar e recortar PNG) isto não parece impossível. No entanto, não consigo encontrar uma biblioteca de recorte / dimensionamento que não tem uma dependência externa ou nativa.

Existe uma biblioteca de JavaScript genuinamente pura para recortar/redimensionar? Quão difícil seria implementar isso em JavaScript puro, se eu tivesse que fazê-lo eu mesmo? E por onde devo começar?

alternativamente, existe uma função C adequada para isso que eu poderia compilar usando emscripten, por exemplo?

Author: Oliver Moran, 2014-09-13

3 answers

Ok, eu acabei enrolando meu próprio, que eu liberei como um pacote NPM aqui: https://www.npmjs.org/package/jimp

A utilização de exemplo é:

var Jimp = require("jimp");

var lenna = new Jimp("lenna.png", function () {
    this.crop(100, 100, 300, 200) // crop
        .resize(220, 220) // resize
        .write("lenna-small-cropped.png"); // save
});

O avanço foi encontrar um algoritmo de escala bicubica de JavaScript aqui: https://github.com/grantgalitz/JS-Image-Resizer

Parabéns ao Mike 'Pomax' Kamermans por apontar a direcção certa e conceder ao Galitz um algoritmo de escala incrível.
 43
Author: Oliver Moran, 2014-09-13 23:07:03

Pode tentar comparar o nó.módulos js para manipulação de imagens - https://github.com/ivanoff/images-manipulation-performance

author's results:
  sharp.js : 9.501 img/sec; done in 10.525585 sec;
  canvas.js : 8.246 img/sec; done in 12.12766 sec;
  gm.js : 4.433 img/sec; done in 22.557112 sec;
  gm-imagemagic.js : 3.654 img/sec;
  lwip.js : 1.203 img/sec;
  jimp.js : 0.445 img/sec;
 0
Author: Dimitry Ivanov, 2016-08-11 06:48:48

Exemplo de dimensionamento e recorte usando manipulação de imagem javascript pura com MarvinJ:

var canvas1 = document.getElementById("canvas1");
var canvas2 = document.getElementById("canvas2");
var canvas3 = document.getElementById("canvas3");

image = new MarvinImage();
image.load("https://i.imgur.com/gaW8OeL.jpg", imageLoaded);

function imageLoaded(){
  imageOut = image.clone()
  image.draw(canvas1)	
  // Crop
  Marvin.crop(image, imageOut, 50, 50, 100, 100);
  imageOut.draw(canvas2);
  // Scale
  Marvin.scale(image, imageOut, 100);
	imageOut.draw(canvas3); 
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
<canvas id="canvas1" width="200" height="200"></canvas>
<canvas id="canvas2" width="200" height="200"></canvas><br/>
<canvas id="canvas3" width="200" height="200"></canvas>
 0
Author: Gabriel Ambrósio Archanjo, 2017-11-16 02:27:13