纯JavaScript图像处理

纯JavaScript图像处理,javascript,node.js,png,image-manipulation,Javascript,Node.js,Png,Image Manipulation,我有一个用例,我想创建(a)一个节点应用程序,它(b)执行基本的图像操作(PNG调整大小和裁剪),但(c)我不能有外部依赖项,如本机库、GraphicsMagick、ImageMagick、PhantonJS、Inkscape等 这一切都必须在纯JavaScript中完成 考虑到我想做的操作是多么简单(只需调整PNG大小和裁剪),这似乎不是不可能的。但是,我找不到最终没有外部或本机依赖关系的裁剪/调整库 对于裁剪/调整大小是否存在这样一个真正纯粹的JavaScript库?如果我必须自己做,用纯J

我有一个用例,我想创建(a)一个节点应用程序,它(b)执行基本的图像操作(PNG调整大小和裁剪),但(c)我不能有外部依赖项,如本机库、GraphicsMagick、ImageMagick、PhantonJS、Inkscape等

这一切都必须在纯JavaScript中完成

考虑到我想做的操作是多么简单(只需调整PNG大小和裁剪),这似乎不是不可能的。但是,我找不到最终没有外部或本机依赖关系的裁剪/调整库

对于裁剪/调整大小是否存在这样一个真正纯粹的JavaScript库?如果我必须自己做,用纯JavaScript实现这一点有多困难?我应该从哪里开始


或者,是否有一个合适的C函数,我可以使用emscripten编译,例如?

好的,我最终使用了我自己的,我在这里发布了一个NPM包:

示例用法是:

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
});
突破之处在于找到了一种JavaScript双三次双通道缩放算法:


感谢Mike“Pomax”Kamermans指出了正确的方向,并授予Galitz惊人的缩放算法。

您可以尝试比较Node.js模块的图像处理-


使用纯javascript图像操作调整大小和裁剪的示例:

var canvas1=document.getElementById(“canvas1”);
var canvas2=document.getElementById(“canvas2”);
var canvas3=document.getElementById(“canvas3”);
image=新的MarvinImage();
image.load(“https://i.imgur.com/gaW8OeL.jpg“,图像加载);
函数imageLoaded(){
imageOut=image.clone()
图像绘制(画布1)
//收成
马文作物(图像,图像输出,50,50,100,100);
imageOut.draw(画布2);
//鳞片
马文刻度(图像,图像输出,100);
imageOut.draw(canvas3);
}



@JamesG。如果我可以使用无头浏览器(如Phantom JS)和DOM实现(如JS DOM),这一切都很棒。然而,它们都有外部(本机)依赖关系,用纯Javascript处理PNG是可能的——对于“可能”有一个宽泛的解释。Javascript可以使用eaze操作二进制文件;解压缩然后重新压缩原始图像数据并不是那么容易(这需要一个纯JS版本的Flate和Deflate),但仍然在“可行”的范围内。不过,我认为不会很快。@Jongware,谢谢。快速不是一个要求。唯一的限制是我不能回复任何类型的本机依赖项。对于JPG文件,它可以正常工作。对于PNG,请尝试一下。作为将来的参考,npmjs.org是你的朋友,你应该尝试一下它在你搜索时找到的库=)谢谢你,我很惊讶没有什么反馈。我不得不对它进行一些修改,以便直接使用缓冲区,对于小操作来说,它看起来确实很棒。干得好@伊戈尔,谢谢。如果您有任何改进,请打开一个问题或提出请求:我所做的是不完整的,仅适用于jpg,这是一个肮脏的实现,不足以进行拉取,只是为了我的目的使其工作。当我有时间的时候,我会尝试完成png,改进代码,然后提出拉取请求。我只是想知道,当完全可以不使用*Magicks时,大多数人怎么会对*Magicks的负担感到高兴。Jimp(JavaScript图像处理程序)真是太棒了。我今天晚上才发现的。它在190秒内调整了8K~200x300幅图像的大小。我计划在接下来的几天里探索它的许多其他技巧。同时:好极了!我已经用Jimp好几个月了。我使用它作为夏普的后备(因为夏普堆得更快,但通常不安装)。也就是说,奥利弗莫兰的荣誉,干得好!这是它在盒子上说的一切:无依赖性,工作良好。我不知道为什么这被否决,但我发现上面的链接非常有用。你可以使用节点画布完成这项工作,然后保存到文件中。我正试图在我遇到困难的节点中使用MarvinJ
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;