图像大小调整脚本未返回适当的流以进行进一步处理

时间:2016-11-01 21:06:31

标签: asp.net asp.net-mvc image-processing asp.net-mvc-5

当前项目:

  • ASP.NET 4.5.2
  • MVC 5

我正在尝试利用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压缩之前尽可能。

1 个答案:

答案 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,而且因为我将最终的“完整”图像以及缩略图直接存储到数据库中,所以我现在还没有管道整个血腥的图像两次

张贴这样,像我一样的其他轮子重新发明的傻瓜实际上会有一些东西可以继续。