- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要根据上传的照片创建 4 种图像尺寸:大、中、小和超小。它在很大程度上适用于下面的代码,但大尺寸和中尺寸需要在左下角放置水印,但较小的两个尺寸则不需要。
似乎对于带水印的图像,我需要复制文件流并为每个图像保存一个单独的实例。速度和效率在这里很重要,所以我想确保我以最好的方式做到这一点。
GM Node 模块确实缺乏文档。有关详细信息,他们链接到 GraphicsMagick 站点,如果您尝试使用 GM 模块执行此操作,则该站点没有帮助。真是令人沮丧。
所以基本上,我可以使用帮助来弄清楚如何在两个较大尺寸上制作水印,然后我也只是想知道下面的代码是否尽可能高效。在我的本地计算机上创建 4 个尺寸时似乎有点慢。
var fileName = req.files.photo.name,
fileBaseName = fileName.substr(0, fileName.lastIndexOf('.')),
uploadRoot = SiteConfig.root + '/upload/',
photosRoot = SiteConfig.root + '/photos/',
publicRoot = SiteConfig.root + '/public/';
require('fs').rename(
req.files.photo.path,
uploadRoot + fileName,
function(error)
{
if (error)
{
res.send({ error: 'upload error' });
return;
}
var ImageSizes = {
large: {
width: 990,
height: 990
},
medium: {
width: 550,
height: 550
},
small: {
width: 145,
height: 145
},
xsmall: {
width: 55,
height: 55
}
};
var GM = require('gm'),
fileStream = require('fs').createReadStream(photosRoot + fileName);
var lgPath = photosRoot + fileBaseName + '_lg.jpg',
mdPath = photosRoot + fileBaseName + '_md.jpg',
smPath = photosRoot + fileBaseName + '_sm.jpg',
xsPath = photosRoot + fileBaseName + '_xs.jpg';
// I'm guessing the second parameter is to set the format
GM(fileStream, 'img.jpg')
.size(
{
bufferStream: true
},
function(err, size)
{
console.log(size.width);
console.log(size.height);
if (size.width > ImageSizes.large.width || size.height > ImageSizes.large.height)
this.resize(ImageSizes.large.width, ImageSizes.large.height);
// Auto-orient based on EXIF data then remove EXIF data
this
.autoOrient()
.noProfile()
.quality(70)
.write(
lgPath,
function (err)
{
if (!err)
{
console.log('write large done');
this
.resize(ImageSizes.medium.width, ImageSizes.medium.height)
// watermark code - i want to continue using the file stream instead of a file path
//.subCommand('composite')
//.gravity('Center')
//.in('-compose', 'Over', watermarkFilePath, baseFilePath)
.quality(70)
.write(
mdPath,
function (err)
{
if (!err)
{
console.log('write medium done');
this
.resize(ImageSizes.small.width, ImageSizes.small.height)
.crop(ImageSizes.small.width, ImageSizes.small.height)
.quality(70)
.write(
smPath,
function (err)
{
if (!err)
{
console.log('write small done');
this
.resize(ImageSizes.xsmall.width, ImageSizes.xsmall.height)
.quality(70)
.write(
xsPath,
function (err)
{
if (!err)
console.log('write xsmall done');
else
console.log('write xsmall error');
}
);
}
else
console.log('write small error');
}
);
}
else
console.log('write medium error');
}
);
}
else
console.log('write large error');
}
);
}
);
}
);
最佳答案
(请注意,这不是真正的代码,只是关于实际代码可能是什么样子的想法)
我突然想到你想做这样的事情:
server.on('incomingImage', function (image, res) {
async.each(imageOptions, function (imageOptions, done) {
image
.pipe(resize(imageOptions))
.pipe(fs.createWriteStream(baseDir + image.path + imageOptions.path))
.on('end', done);
}, function (err) {
if (err) {
res.send(500);
} else {
res.send(204);
}
});
});
也就是说,当图像进来时,为每个图像选项创建一个调整大小通过流和一个文件写入流,然后将图像通过所有调整大小流传输到文件写入流,一旦所有文件都写入完毕,就做出响应。
通过使用流进行并行处理,您可以最大限度地减少服务器由于 IO 而必须执行的等待时间(这首先是 Node.js 背后的基本思想)。
您正在将文件写入磁盘,然后依次处理每个图像选项并将它们写入磁盘,然后再开始从磁盘读取文件。
所以这是写入时间 x 1 + 读取时间 x 5 + 处理时间 x 5 + 写入时间 x 5
相反,它应该是最大处理时间 + 最大写入时间,这要短得多。
由于 gm
模块没有提供良好的流接口(interface),因此存在一些复杂性。您可能想看看是否有更好的模块。
还有关于流的主题:
https://github.com/substack/stream-handbook http://nodeschool.io/#stream-adventure
并且异步
关于Node.js、Express 和 GM (GraphicsMagick) - 添加水印和一般图像处理效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375090/
我正在尝试使用水印并使用复杂过滤器应用 Yadif,但我无法弄清楚如何使用以下语法应用 Yadif ffmpeg -i "source:" -i C:\logo.png -c:v libx264 -p
我正在使用 zubrags PHP 水印脚本(附在下面),它工作得很好,除非我尝试使用 PNG-24 作为我的水印。生成的图像有一个乱码、不透明的水印。我想知道是否有人可以帮助解释我需要在下面的脚本中
基本上,我想拍摄用户从照片库中选择的图像,然后应用水印,即右下角的一个三角形,上面有应用程序名称。我已经在 Photoshop 中使用透明层制作了第二张图像。 我尝试了一个函数,我不记得它的确切名称,
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
这个问题我已经发了很多次了,但还是找不到正确的答案。我的目标是加载 PDF(扫描的调查问卷页),用页码标记每个页面,并将每个页面保存在单独的 JPEG 文件中以供以后使用。除了未绘制 NSString
你好,我的代码有问题 $obj = new stdClass(); $obj->cat_id = !empty($_POST['cat_id']) ? $_POST['cat_id']
SO 上有很多类似的问题/答案,但似乎没有一个能解决我的问题。 我的目标是使用 Paperclip 为图像生成“动态水印”(用户头像覆盖在另一张图像上)。我遇到的问题是我无法获得模型的“user_id
我想在我的图片上添加水印,这是我用来截图的代码。有人可以教我如何在图像中添加水印吗?我想在图片的右上角有一个小 Logo 。 我正在尝试研究是否可以实现我在 Canvas 中保留的内容,以便在截取屏幕
我有以下命令: ffmpeg -ss 00:00:30 -i "$i" -i ../audio.mov -map 0:0 -map 1:0 -to 30 -vf "fade=in:0:24, fade
我正在尝试从一些图片以及现有的 mp3(复制)制作幻灯片。图片尺寸不同,但我希望视频输出为 16:9 纵横比和 3840x2160。我也想要水印。重要的是不要拉伸(stretch)图片。 我试过这个代
我已经可以给任何 PDF 加水印,里面的图像,一切正常,但现在我只需要在打印 PDF 时才显示水印......这可能吗?如何? 我当然需要以编程方式执行此操作。 最佳答案 对于 future 的读者,
有没有办法在整个网页上创建浅色透明水印?一个留在屏幕上,即使它滚动?我的想法是创建一个 .PNG 位图并使用带有样式表的 DIV 标签,该样式表将我的 PNG 设置为背景图像,并设置绝对位置。问题是,
是否可以屏蔽应用程序的屏幕截图(电源 + 菜单按钮)?如果没有,此屏幕截图是否有可能收到水印? 问候,克劳迪奥 最佳答案 创建屏幕截图是一种系统行为,您不能覆盖它。 重复 Notification o
所以我一直在寻找如何为图像添加带有 colorBox 的水印,我在谷歌的第一个结果中找到了一个较旧的 colorBox 组,下一个答案是: Jack Moore 10/3/09 Ok, this sh
我有以下 CSS, #duplicateCopy { -webkit-transform:rotate(-20deg); -moz-transform:rotate(-20deg);
我有一个 pdf在它的背景上有水印。当开始扫描以在背景中突出显示带有水印或注释的任何单词时,它会被选中,因为它首先在触摸区域中找到。 我正在使用 CGPDFScanner 扫描文本。 我的问题是如何检
我正在寻找一种在选定字段上放置水印的方法。 那是行不通的-> [select* c_type class:ic watermark "choose type" "a" "b" "c"] 为了放置验证失
我正在尝试向视频添加各种 Gifs/水印,但我无法让它正常工作。 我们假设视频时长为 60 秒,我正在添加一张 Gif 图片。输出看起来正确,声音打开,gif 动画,视频没有停止。这是代码:
我正在尝试使用 FFmpeg 以编程方式将图像或视频叠加在另一个视频的顶部。似乎 AVFilter 可以做到这一点。 有很多关于如何使用命令行执行此操作或类似操作的示例,但是,除了 doc/examp
我正在尝试实现类似 StackOverflow 的水印功能。 我正在使用 jquery-watermark为了这。我遇到的问题是水印文本随着输入元素获得焦点而消失,这在 SO 中不会发生(我也不希望在
我是一名优秀的程序员,十分优秀!