当前项目:
我正在尝试利用TinyPNG API,如果我只是将图像传输到它,它的效果很好。但是,由于大多数用户将使用移动设备,并且这些用户以远高于所需的分辨率生成图像,因此我希望在将这些文件传输到TinyPNG之前降低这些文件的分辨率。我希望这些重新调整大小的图像比原版图像小得多,让我可以更快地进行往返。
我的代码:
public static async Task<byte[]> TinyPng(Stream input, int aspect) {
using(Stream output = new MemoryStream())
using(var png = new TinyPngClient("kxR5d49mYik37CISWkJlC6YQjFMcUZI0")) {
ResizeImage(input, output, aspect, aspect); // Problem area
var result = await png.Compress(output);
using(var reader = new BinaryReader(await (await png.Download(result)).GetImageStreamData())) {
return reader.ReadBytes(result.Output.Size);
}
}
}
public static void ResizeImage(Stream input, Stream output, int newWidth, int maxHeight) {
using(var srcImage = Image.FromStream(input)) {
var newHeight = srcImage.Height * newWidth / srcImage.Width;
if(newHeight > maxHeight) {
newWidth = srcImage.Width * maxHeight / srcImage.Height;
newHeight = maxHeight;
}
using(var newImage = new Bitmap(newWidth, newHeight))
using(var gr = Graphics.FromImage(newImage)) {
gr.SmoothingMode = SmoothingMode.AntiAlias;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
newImage.Save(output, ImageFormat.Jpeg);
}
}
}
因此,ResizeArea
假定接受流并输出流,这意味着TinyPNG .Compress()
应该与output
一样好用它将与原始input
。不幸的是,只有.Compress(input)
工作 - 使用.Compress(output)
TinyPNG会抛出错误:
400 - Bad Request. InputMissing, File is empty
我知道TinyPNG有自己的调整大小例程,但我希望在之前将图像通过网络发送到TinyPNG,这样文件大小(以及传输时间)就会减少在实际的TinyPNG压缩之前尽可能。
答案 0 :(得分:0)
...... Aaaa和我刚刚完全使用其他工具解决了我的问题。
我找到了ImageProcessor。文档是一个皇家,因为它只有一个Windows *.chm help file(它的不在线...提示一个史诗威士忌.Tango.Foxtrot。),但看了{ {3}} a few它确实很好地解决了我的问题:
public static async Task<byte[]> TinyPng(Stream input, int aspect) {
using(var output = new MemoryStream())
using(var png = new TinyPngClient("kxR5d49mYik37CISWkJlC6YQjFMcUZI0")) {
using(var imageFactory = new ImageFactory()) {
imageFactory.Load(input).Resize(new Size(aspect, 0)).Save(output);
}
var result = await png.Compress(output);
using(var reader = new BinaryReader(await (await png.Download(result)).GetImageStreamData())) {
return reader.ReadBytes(result.Output.Size);
}
}
}
现在一切正常。上传速度要快得多,因为我没有直接将全尺寸图像传输到TinyPNG,而且因为我将最终的“完整”图像以及缩略图直接存储到数据库中,所以我现在还没有管道整个血腥的图像两次。
张贴这样,像我一样的其他轮子重新发明的傻瓜实际上会有一些东西可以继续。