在节点 js 下调整图像大小和裁剪工作的问题
issue with getting image resizing and cropping to work under node js
我无法理解节点 js 中的图像处理。很遗憾也很高兴这将成为我申请的重要部分。
我要实现的目标如下:
1) 用户上传图像(=> 多部分表单数据被发送到包含所有数据的服务器。这很好用)
2) 将该图片调整为最大宽度 640px。
3) 从 Y 轴裁剪图片:some_variable 到 Y 轴 some_variable + max_height (240) 和 X 轴:0 到 X 轴 640px
4) 像这样保存在服务器上。
这是我目前使用 multer 和 lwip
的悲惨方法
示例图片数据:
Files { fieldname: 'picture_data',
originalname: 'dog-how-to-select-your-new-best-friend-thinkstock99062463.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'public/imgs/',
filename: '1-picture_data-1453136557949.jpg',
path: 'public/imgs/1-picture_data-1453136557949.jpg',
size: 1790149 }
我的路由器在此函数中接收到此数据:
router.post('/someCall', upload.single('picture_data'), function(req, response) {
...
});
现在调用了 multer 上传函数:
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public/imgs/');
},
filename: function (req, file, cb) {
// CHECK IF FILE IS TOO BIG
var fileSize = file.size;
File_controller.checkFeedPostFileSize(fileSize, function(err, res){
if(res == "File size ok"){
var mimeType = file.mimetype;
File_controller.checkMimeTypeImage(mimeType, function(err, res){
// FILE IS OK AND MAY BE SAVED.
if(res == "Mimetype ok"){
var ending = ".jpg";
if(mimeType == "image/jpeg"){
ending = ".jpg";
}else if(mimeType = "image/png"){
ending = ".png";
}
var filename = req.session.user.id + "-" + file.fieldname + '-' + Date.now() + ending;
req.session.user.file_name = filename;
cb(null, filename);
var path = 'public/imgs/' + req.session.user.filename;
lwip.open(path, function(err, image){
if (err) return console.log("LWIP BILD NICHT GEFUNDEN", err);
image.resize(640, function(){
});
});
}else{
//response.send("Error: Mimetype not ok");
}
});
}else{
//response.send("Error: File size too big");
}
});
}
});
现在这种方法一直有效到 lwip 部分。这意味着文件以其原始上传大小保存到服务器。据我了解模块 lwip 现在应该从服务器打开图像然后调整它的大小 并再次保存它.
这种方法很笨拙,我相信它可以在保存和重新打开文件之前在途中完成。但是,如果您帮助我以任何方式让它工作,我将非常感激。
如果缺少解决此问题的任何信息,请告诉我。我会毫不犹豫地包括所有必要的东西。
谢谢
您应该在路由器处理程序中打开图像,文件系统中存在文件后将调用该图像。 diskStorage
上的两个选项在文件完全上传之前被调用。从 filename
中删除 lwip 部分,然后尝试按照以下方式进行操作:
router.post('/someCall', upload.single('picture_data'), function(req, response) {
lwip.open(req.file.path, function(err, image){
image.batch()
.resize(640)
.writeFile('output.jpg', function(err){
if (err){
response.status(400).send({ error: err.toString() });
}
else {
response.status(200).end();
}
}
);
});
});
我无法理解节点 js 中的图像处理。很遗憾也很高兴这将成为我申请的重要部分。
我要实现的目标如下:
1) 用户上传图像(=> 多部分表单数据被发送到包含所有数据的服务器。这很好用) 2) 将该图片调整为最大宽度 640px。 3) 从 Y 轴裁剪图片:some_variable 到 Y 轴 some_variable + max_height (240) 和 X 轴:0 到 X 轴 640px 4) 像这样保存在服务器上。
这是我目前使用 multer 和 lwip
的悲惨方法示例图片数据:
Files { fieldname: 'picture_data',
originalname: 'dog-how-to-select-your-new-best-friend-thinkstock99062463.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'public/imgs/',
filename: '1-picture_data-1453136557949.jpg',
path: 'public/imgs/1-picture_data-1453136557949.jpg',
size: 1790149 }
我的路由器在此函数中接收到此数据:
router.post('/someCall', upload.single('picture_data'), function(req, response) {
...
});
现在调用了 multer 上传函数:
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'public/imgs/');
},
filename: function (req, file, cb) {
// CHECK IF FILE IS TOO BIG
var fileSize = file.size;
File_controller.checkFeedPostFileSize(fileSize, function(err, res){
if(res == "File size ok"){
var mimeType = file.mimetype;
File_controller.checkMimeTypeImage(mimeType, function(err, res){
// FILE IS OK AND MAY BE SAVED.
if(res == "Mimetype ok"){
var ending = ".jpg";
if(mimeType == "image/jpeg"){
ending = ".jpg";
}else if(mimeType = "image/png"){
ending = ".png";
}
var filename = req.session.user.id + "-" + file.fieldname + '-' + Date.now() + ending;
req.session.user.file_name = filename;
cb(null, filename);
var path = 'public/imgs/' + req.session.user.filename;
lwip.open(path, function(err, image){
if (err) return console.log("LWIP BILD NICHT GEFUNDEN", err);
image.resize(640, function(){
});
});
}else{
//response.send("Error: Mimetype not ok");
}
});
}else{
//response.send("Error: File size too big");
}
});
}
});
现在这种方法一直有效到 lwip 部分。这意味着文件以其原始上传大小保存到服务器。据我了解模块 lwip 现在应该从服务器打开图像然后调整它的大小 并再次保存它.
这种方法很笨拙,我相信它可以在保存和重新打开文件之前在途中完成。但是,如果您帮助我以任何方式让它工作,我将非常感激。
如果缺少解决此问题的任何信息,请告诉我。我会毫不犹豫地包括所有必要的东西。
谢谢
您应该在路由器处理程序中打开图像,文件系统中存在文件后将调用该图像。 diskStorage
上的两个选项在文件完全上传之前被调用。从 filename
中删除 lwip 部分,然后尝试按照以下方式进行操作:
router.post('/someCall', upload.single('picture_data'), function(req, response) {
lwip.open(req.file.path, function(err, image){
image.batch()
.resize(640)
.writeFile('output.jpg', function(err){
if (err){
response.status(400).send({ error: err.toString() });
}
else {
response.status(200).end();
}
}
);
});
});