目前,我正处于将一个“旧”的ASP MVC项目迁移到新的Core (1.1)的情况下,从一个突然变化到另一个变化。我现在被困在主题“图像处理”上,因为System.Web.Helpers.WebImage被删除了。我研究了几种可能的解决方案,并喜欢通过Microsoft.AspNetCore.NodeServices在this comment!中描述的方法。
当使用示例脚本和传入文件名时,所有这些都工作得很好。现在,我已经花了几个小时试着让这个东西来传递一个字节流,因为我从DB读取图像数据,并想直接将它传输到JS。
使用JIMP库的JS:
var jimp = require("jimp");
module.exports = function (result, source, mimeType, maxWidth, maxHeight) {
// Invoke the 'jimp' NPM module, and have it pipe the resulting image data back to .NET
jimp.read(source.buffer).then(function (file) {
var width = maxWidth || jimp.AUTO;
var height = maxHeight || jimp.AUTO;
file.resize(maxWidth, height)
.getBuffer(mimeType, function (err, buffer) {
var stream = result.stream;
stream.write(buffer);
stream.end();
});
}).catch(function (err) {
console.error(err);
});
};我的图像控制器上的动作
var imageStream = await _nodeServices.InvokeAsync<Stream>(
"Node/resizeImageBuffer",
bild.BildDaten.Daten, // byte[]
bild.Mimetype, // "image/jpeg"
targetsize, // e.g. 400
targetsize);当我这样调用它时,我的byte[]会被序列化为string,而不作为节点中的缓冲区工作。
当我尝试在流中包装时,JS甚至不会被执行,因为它在序列化参数时中断。就像这样:
var imageStream = await _nodeServices.InvokeAsync<Stream>(
"Node/resizeImageBuffer",
new MemoryStream(bild.BildDaten.Daten), // MemoryStream
bild.Mimetype, // "image/jpeg"
targetsize, // e.g. 400
targetsize);它抛出
JsonSerializationException: Error getting value from 'ReadTimeout' on 'System.IO.FileStream'.我要做的是,从Node到C#的结果流可以工作,并且是一个有效的System.IO.Stream对象,但它不作为输出参数.也许有人有主意?
发布于 2018-11-08 23:22:53
最后,我使用System.BitConverter.ToString()将图像byte[]转换为其十六进制字符串表示,并将其传递给节点脚本。
var byteString = System.BitConverter.ToString(image.Bytes);
var img = await _nodeServices.InvokeAsync<Stream>(
"./NodeServices/thumbnail",
"image/jpeg",
byteString,
width,
height
);然后在节点脚本中,我将十六进制字符串解析回一个字节数组,用它创建一个缓冲区,然后能够将缓冲区传递给jimp。
const jimp = require('jimp')
module.exports = function (result, mimeType, bytes, maxWidth, maxHeight) {
const parsedBytes = bytes.split('-').map(e => parseInt(`0x${e}`))
const buffer = Buffer.from(parsedBytes)
jimp.read(buffer)
.then((img) => {
var width = maxWidth || jimp.AUTO
var height = maxHeight || jimp.AUTO
img.resize(width, height)
.getBuffer(mimeType, function (err, buffer) {
const stream = result.stream
stream.write(buffer)
stream.end()
})
})
.catch(err => {
console.error(err)
})
}我希望能找到一种将byte[]数组本身传递给节点脚本的方法,但现在我很高兴它能工作。
https://stackoverflow.com/questions/45571137
复制相似问题