GraphicsMagick和ImageMagick库之间的实际区别是什么(要比较的源列表或文章)?
我发现自己正在评估这两个库.除了GraphicsMagick的比较说,我看到ImageMagick仍然有更新,似乎两者几乎相同.
我只是想在C++中进行基本的图像处理(即图像加载,滤镜,显示); 在这些库之间进行选择时,我应该注意哪些差异?
当我尝试调整像这样的图像:
gm('public/uploads/1710410635.jpg')
.resize(240, 240)
.noProfile()
.write('public/uploads/1710410635_t.jpg', function (err) {
if (!err) console.log('done');
});
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:945:11)
at Process.ChildProcess._handle.onexit (child_process.js:736:34)
Run Code Online (Sandbox Code Playgroud)
我的文件结构如下:

代码在postnewsitem.js文件中执行
为什么会出现此错误以及如何解决?
编辑:GraphicsMagick工作,证明:

var buf = require('fs').readFileSync('test.jpg');
gm().in('-page', '+0+0').in(buf,'test.jpg').write('output.jpg', function (err) {
if (err) console.log(err);
})
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想将缓冲区数据作为输入传递给gm.in()方法.
下面是我正在引用的链接,但在其中,图像路径用作输入.我想使用缓冲区数据作为输入.我怎样才能做到这一点?
我一直在尝试使用gmNodeJS 的软件包创建一些缩略图,但我很幸运.我需要调整大于600x600的图像(可以是任何宽度/高度,从给定的一个开始)但是当我将大小传递给gm时,它会创建一个与我请求的大小不同的图像.
例如,鉴于此代码,我假设运行node app /path/to/image.png我将收到一个大小为200x100的图像,但我得到的是180x100或200x90的图像......
gm(fileLocation)
.thumb(200, 100, 'processed.' + process.argv[2].split('.').pop(), function() {
console.log("Done!");
});
Run Code Online (Sandbox Code Playgroud)
我也尝试过调整大小选项.甚至有一个强制大小的选项,但输出的宽高比变得可怕......
gm('/path/to/image.jpg')
.resize(353, 257)
.write(writeStream, function (err) {
if (!err) console.log(' hooray! ');
});
Run Code Online (Sandbox Code Playgroud) 我想要实现以下目标:
1)我在java端有一个表示图像的字节数组.
2)我需要让我的本机代码访问它.
3)本机代码使用GraphicsMagick解码此图像,并通过调用resize创建一堆缩略图.它还计算图像的感知散列,该散列是矢量或unint8_t数组.
4)一旦我将这些数据返回给Java端,不同的线程就会读取它.缩略图将通过HTTP上传到某些外部存储服务.
我的问题是:
1)将字节从Java传递到我的本机代码的最有效方法是什么?我可以将其作为字节数组访问.我认为将其作为字节缓冲区(包装此字节数组)与字节数组传递在此处没有任何特别的优势.
2)将这些缩略图和感知哈希返回给java代码的最佳方法是什么?我想到了几个选择:
(i)我可以在Java中分配一个字节缓冲区,然后将其传递给我的本机方法.然后,本机方法可以写入并在完成后设置一个限制并返回写入的字节数或一些表示成功的布尔值.然后,我可以对字节缓冲区进行切片和切块,以提取不同的缩略图和感知哈希,并将其传递给将上传缩略图的不同线程.这种方法的问题是我不知道要分配的大小.所需的大小将取决于我提前生成的缩略图的大小和缩略图的数量(我事先知道).
(ii)一旦我知道所需的大小,我也可以在本机代码中分配字节缓冲区.我可以根据自定义打包协议将我的blob记忆到正确的区域并返回此字节缓冲区.(i)和(ii)都很复杂,因为自定义打包协议必须指示每个缩略图的长度和感知散列.
(iii)定义一个具有缩略图字段的Java类:字节缓冲区数组和感知散列字节:字节数组.当我知道所需的确切大小时,我可以在本机代码中分配字节缓冲区.然后,我可以将GraphicsMagick blob中的字节memcpy到每个字节缓冲区的直接地址.我假设还有一些方法来设置写在字节缓冲区上的字节数,以便java代码知道字节缓冲区有多大.设置字节缓冲区后,我可以填写我的Java对象并返回它.与(i)和(ii)相比,我在这里创建了更多的字节缓冲区以及Java对象,但我避免了自定义协议的复杂性.(i),(ii)和(iii)背后的基本原理 - 鉴于我对这些缩略图的唯一做法是上传它们,我希望通过NIO上传它们时保存带字节缓冲区(vs字节数组)的额外副本.
(iv)定义一个Java类,它具有缩略图的字节数组(而不是字节缓冲区)和感知散列的字节数组.我在我的本机代码中创建这些Java数组,并使用SetByteArrayRegion从我的GraphicsMagick blob复制字节.与以前的方法相比,缺点是,当上传它时,将这个字节数组从堆复制到某个直接缓冲区时,现在Java中还会有另一个副本.不确定我是否会在复杂性方面保存任何东西,而不是(iii).
任何建议都会很棒.
编辑:@main提出了一个有趣的解决方案.我正在编辑我的问题以跟进该选项.如果我想像@main建议的那样在DirectBuffer中包装本机内存,我怎么知道何时可以安全地释放本机内存?
我正在尝试在Mountain Lion上安装GraphicsMagick并遇到问题.我尝试了所有可以在博客和其他stackoverflow问题中搜索的内容,但没有任何效果.所以我把每一个命令都带来了一大堆错误.请看看并帮助我.
我跑的时候
brew install graphicsmagick
Run Code Online (Sandbox Code Playgroud)
我明白了
Warning: Could not link jpeg. Unlinking...
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link jpeg'
Run Code Online (Sandbox Code Playgroud)
和
Warning: Could not link libpng. Unlinking...
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link libpng'
Run Code Online (Sandbox Code Playgroud)
在最后我得到了
==> make install
Warning: Could not link …Run Code Online (Sandbox Code Playgroud) 我正在使用gmNode.js 的包以及AWS Lambda上提供的默认ImageMagick安装.
const gm = require('gm').subClass({ imageMagick: true });
出于某种原因,某些图像的调整大小功能失败.
我使用Amazon Linux AMI(ami-hvm-2016.03.3.x86_64-gp2)创建了一个EC2实例.我安装了可用的(旧)6.x版ImageMagick yum.当我在EC2实例上使用该安装运行我的脚本时,它会再现我在Lambda上运行代码时看到的失败,确认这是导致失败的此版本IM的问题.
如果我安装GrpahicsMagick sudo yum install GraphicsMagick.这允许我的脚本无错误地执行调整大小.
const gm = require('gm').subClass({ imageMagick: false });
但是,我不确定如何在无服务器的部署中捆绑这个.如果我将GraphicsMagick安装到与脚本相同的文件夹中sudo yum --installroot=/var/task install GraphicsMagick,并使用此require语句运行我的脚本:
const gm = require('gm').subClass({ imageMagick: false, appPath: './usr/bin/' });
当我在EC2实例上运行脚本时,调整大小工作.但是,当我使用无服务器进行部署,并且脚本在Lambda中运行时,可执行文件似乎已损坏. gm在调用时失败并出现以下错误gm(buffer).size(/*...*/).
could not get the image size: ERR:
{"code":"EPIPE","errno":"EPIPE","syscall":"write"}
如何构建可以无服务器部署的ImageMagick或GraphicsMagick版本?
imagemagick node.js graphicsmagick aws-lambda serverless-framework
我想在Python中将以下HTML转换为PNG图像.
<html>
<b>Bold text</b>
</html>
Run Code Online (Sandbox Code Playgroud)
当然,这个HTML就是一个例子.
我尝试了'pisa',但它将html转换为PDF,而不是图像.我可以将HTML转换为PDF然后将PDF转换为PNG,但我想知道是否有任何直接解决方案(即HTML到PNG).任何内置或外置模块都可以很好地工作.
如果这可以在Graphicsmagick或Imagemagick中完成,那么它将是完美的.
我试图将文件读入缓冲区,调整大小,然后使用以下示例代码将其写入磁盘:
function processImage(data) {
gm(data, 'test.jpg')
.resize('300x300')
.background('white')
.flatten()
.setFormat('jpg')
.toBuffer(function(err, buffer) {
if (err) {
throw err;
} else {
fs.writeFile('asd.jpg', buffer);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误Error: Stream yields empty buffer.我玩过,使用过imageMagick和graphicsMagick,还是一样的.
如果我代替
toBuffer(...
用
write('asd.jpg', function(err) ...
它实际上写了一个合适的文件.
编辑在写这个问题时,我找到了解决方案,请参阅回复
graphicsmagick ×10
imagemagick ×6
node.js ×6
image ×2
aws-lambda ×1
c++ ×1
comparison ×1
homebrew ×1
html ×1
java ×1
macos ×1
python ×1