我正在考虑在Java项目中使用GraphicsMagick(http://www.graphicsmagick.org/).有人对这个有经验么?关于如何入门的建议?似乎没有本机Java库,因此可能会有点困难.
谢谢!
我正在寻找一种非常快速的方法来渲染放置在某些背景上的小瓷砖的动态图像(想象一下动态渲染国际象棋游戏并在每个玩家移动后发送图像).所以程序似乎很简单:1.采取一些背景2.使用图像偏移从上到下放置国际象棋图像的透明图像(以获得正确的视角)3.将整个图像保存为gif
尝试使用imagemagick:
使用类似的东西:
convert -page 176x220 -gravity SouthWest 1.png -page +35+30 -gravity SouthWest 1.png -page +62+50 1.png -page +10+55 1.png -background none -compose DstOver -flatten result.gif
Run Code Online (Sandbox Code Playgroud)
和图形magick以类似的方式:gm转换... -page + 35 + -30 -flatten ..
但是没有留下深刻的印象,GraphicsMagick提供了更好的结果,但是:
服务器:
user system total real
all: 0.000000 0.000000 47.650000 ( 70.991829)
small: 0.000000 0.000000 6.600000 ( 8.110900)
medium: 0.000000 0.000000 6.820000 ( 8.494131)
large: 0.000000 0.000000 10.890000 ( 15.818351)
extreme: 0.000000 0.000000 11.160000 ( 19.873541)
biggest: 0.000000 0.000000 11.640000 ( 14.327450)
Run Code Online (Sandbox Code Playgroud)
在本地Phenom II x6:
user …Run Code Online (Sandbox Code Playgroud) 我正在使用Express.js并有一个上传图像的路线,然后我需要调整大小.目前我只是Express将文件写入磁盘(我认为node-formidable在封面下使用)然后使用gm(http://aheckmann.github.com/gm/)调整大小,将第二个版本写入磁盘.
gm(path)
.resize(540,404)
.write(dest, function (err) { ... });
Run Code Online (Sandbox Code Playgroud)
我已经读过你可以在将node-formidable文件流写入磁盘之前获取文件流,并且因为gm可以接受流而不仅仅是路径,所以我应该能够通过消除双重写入磁盘来传递这一点.
我想我需要覆盖,form.onPart但我不确定在哪里(它应该作为Express中间件做什么?)而且我不确定如何获取form或者与该如何做什么part.这是我在几个地方看到的代码框架:
form.onPart = function(part) {
if (!part.filename) { form.handlePart(part); return; }
part.on('data', function(buffer) {
});
part.on('end', function() {
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我把这两件放在一起吗?谢谢!
我想将一个独立版本的GraphicsMagick gm二进制文件与一个应用程序捆绑在一起,这样我就不必在运行应用程序的服务器上构建和安装GraphicsMagick库.
我正在创建一个构建系统,它可以生成一个包含整个node.js应用程序的tar-ball,包括所有二进制依赖项(在我们的例子中是node二进制文件和GraphicsMagick库).然后它将其上传到服务器,提取并运行它.
我试图用预先编译的gm二进制文件发送它,但正如预期的那样gm取决于几个库,所以我得到的错误就像gm: error while loading shared libraries: libGraphicsMagick.so.3: cannot open shared object file: No such file or directory.
我在本地运行OSX,我们的服务器运行Ubuntu.
我有一系列具有透明背景的PNG图像,我想要覆盖到目标PNG图像上,该图像也具有透明背景.为了论证,我们可以说这一系列图像是:
由于我想一次覆盖所有图像,我将使用该convert命令,compose交换机如下:
gm convert -compose Atop dest.png img1.png img2.png img3.png -flatten output.png
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但问题是output.png失去了它的透明度,我不知道如何保持它的启用.如果我使用-background开关,我可以设置我想要的任何颜色的透明度,但我不能让它回到透明度.
是的,我随后可以致电:
gm convert -transparency black ouput.png output2.png
Run Code Online (Sandbox Code Playgroud)
但是实际图像上的任何黑色也会变得透明.
这里有什么帮助?
我正在使用CollectionFS来管理图像.此外,我正在使用graphicsmagick gm()来处理图像.
现在我想要裁剪已保存的图像.因此,在单击事件上调用服务器方法,该方法执行crop().但是在这样做之后,我在集合中找到了一个size=0在正确日期更新的空图像.
我没有看到,我做错了什么.
shared.js
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("thumbnail", {
transformWrite: function(fileObj, readStream, writeStream) {
gm(readStream, fileObj.name()).autoOrient().resize('96', '96' + '^').gravity('Center').extent('96', '96').stream().pipe(writeStream);
}
}),
new FS.Store.FileSystem("public"),
]
});
Run Code Online (Sandbox Code Playgroud)
server.js
Meteor.methods({
'crop': function (fileId, selection) {
var file = Images.findOne({ _id: fileId }),
read = file.createReadStream('public'),
write = file.createWriteStream('public');
gm(read)
.crop(selection.width, selection.height, selection.left, selection.top)
.stream()
.pipe(write);
}
});
Run Code Online (Sandbox Code Playgroud)
client.js
Template.editor.events({
'click #crop': function () {
var fileId = '123456789',
selection = { height: 100, …Run Code Online (Sandbox Code Playgroud) 我正在尝试重构以下node.js代码。
每个案例都会生成一个缩略图,将一组不同的GraphicMagic转换链接到图像。
switch(style.name) {
case 'original':
gm(response.Body)
.setFormat('jpg').autoOrient().resize(style.w, style.h, style.option)
.toBuffer(function(err, buffer) { if (err) { next(err); } else { next(null, buffer); } });
break;
case 'large':
gm(response.Body)
.setFormat('jpg').autoOrient().resize(style.w, style.h, style.option)
.quality(style.quality)
.strip().interlace('Plane')
.toBuffer(function(err, buffer) { if (err) { next(err); } else { next(null, buffer); } });
break;
case 'medium':
gm(response.Body)
.setFormat('jpg').autoOrient().resize(style.w, style.h, style.option)
.crop(style.w, style.h, style.crop.x_offset, style.crop.y_offset)
.repage('+')
.strip().interlace('Plane')
.toBuffer(function(err, buffer) { if (err) { next(err); } else { next(null, buffer); } });
break;
case 'small':
gm(response.Body)
.setFormat('jpg').autoOrient().resize(style.w, style.h, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用node.js上的graphicsmagick将gif转换为png.在他们的文档中,他们有以下代码:
// pull out the first frame of an animated gif and save as png
gm('/path/to/animated.gif[0]')
.write('/path/to/firstframe.png', function(err){
if (err) print('aaw, shucks')
})
Run Code Online (Sandbox Code Playgroud)
但是,如果我不是从文件中读取数据,而是从流或缓冲区读取数据呢?在那里我没有给出路径因此不能追加[0].
我需要的是这样的:
gm(streamOrBuffer).extractFrame(0)
.write('/path/to/firstframe.png', function(err){
if (err) print('aaw, shucks')
})
Run Code Online (Sandbox Code Playgroud)
有一个类似的问题在这里,但海报最终绘制画布上的GIF提取客户端上的第一帧.
我找不到任何看起来像我能做的东西的gm命令.有任何想法吗?
将Expressjs与gm(GraphicsMagick)模块一起使用。
我想使用流作为.composite()的输入。
这可能吗,或者有什么办法吗?
我可以使用路径或包含图像路径的变量进行合成,但是我想传入流(myStream)。
例:
var myStream = fs.createReadStream('topimage.png');
var resultStream = gm('/images/background.png')
.composite(myStream)
.gravity('Center')
.geometry('-1020+520')
.stream();
Run Code Online (Sandbox Code Playgroud) 我正在从节点中的远程文件创建GIF,目前通过将每个图像下载到文件系统到tmp文件夹.
我想绕过将图像保存到tmp文件夹并保存在内存中.这可能吗?
如您所见,我的AWS类中有一个下载函数,它保存到tmp文件夹:
download(key){
return new Promise((resolve, reject) => {
request.head(`${this.base_url}/${this.bucket}/${key}`, (err, res, body) => {
request(`${this.base_url}/${this.bucket}/${key}`)
.pipe(fs.createWriteStream(`tmp/${key}`)).on('close', resolve )
})
})
};
Run Code Online (Sandbox Code Playgroud)
一旦他们全部下载了,我在我的GifService类中有一个createGif函数,它将每个文件路径添加为自定义参数gm,添加50ms的延迟,然后调整输出作为缓冲区,然后我上传到AWS s3.
import gm from 'gm';
...
constructor(){
this.gm = gm()
}
generateGif(images, prefix){
return new Promise((resolve, reject) => {
// for each image we want in array, we pass to gm
images.forEach(image => {
this.gm.in(`tmp/${image.Key}`)
})
// Now we create the gif with 50sec delay between images, sized to 600px x 2
this.gm
.delay(50) …Run Code Online (Sandbox Code Playgroud) graphicsmagick ×10
node.js ×5
javascript ×4
gm ×2
imagemagick ×2
build ×1
collectionfs ×1
deployment ×1
express ×1
graphics ×1
image ×1
java ×1
meteor ×1
performance ×1
rmagick ×1
ruby ×1
ubuntu ×1