【问题标题】:Azure Functions Resize blob with two output blobsAzure Functions 使用两个输出 blob 调整 blob 大小
【发布时间】:2019-03-28 18:27:33
【问题描述】:

我有一个 Azure 函数可以调整图像大小,然后保存到另一个容器文件夹。

我的代码是;

private static readonly Dictionary<ImageSize, Tuple<int, int>> ImageDimensionsTable = new Dictionary<ImageSize, Tuple<int, int>>()
{
    { ImageSize.ExtraSmall, Tuple.Create(320, 200) },
    { ImageSize.Small,      Tuple.Create(640, 400) },
    { ImageSize.Medium,     Tuple.Create(800, 600) }
};

private enum ImageSize
{
    /// <summary>
    /// The extra small
    /// </summary>
    ExtraSmall,

    /// <summary>
    /// The small
    /// </summary>
    Small,

    /// <summary>
    /// The medium
    /// </summary>
    Medium
}

[FunctionName("Function1")]
public static void Run(
    [BlobTrigger("vehicle-images/{folder}/{name}", Connection = "")]Stream image,
    string name,
    [Blob("watermarked-vehicle-images/{folder}/s-{name}", FileAccess.ReadWrite, Connection = "")]CloudBlockBlob imageSmall,
    [Blob("watermarked-vehicle-images/{folder}/m-{name}", FileAccess.ReadWrite, Connection = "")]CloudBlockBlob imageMedium,
    TraceWriter log)
{
    // Resize and save Small Image
    var size = ImageDimensionsTable[ImageSize.Small];
    var outputStream = new MemoryStream();
    var instructions = new Instructions
    {
        Width = size.Item1,
        Height = size.Item2,
        Mode = FitMode.Max,
        OutputFormat = OutputFormat.Jpeg,
        JpegQuality = 85
    };

    ImageBuilder.Current.Build(new ImageJob(image, outputStream, instructions));
    outputStream.Seek(0, SeekOrigin.Begin);

    imageSmall.Properties.ContentType = "image/jpeg";
    imageSmall.UploadFromStream(outputStream);

    // Resize and save Medium Image.
    size = ImageDimensionsTable[ImageSize.Medium];    

    var outputStream2 = new MemoryStream();
    var instructions2 = new Instructions
    {
        Width = size.Item1,
        Height = size.Item2,
        Mode = FitMode.Max,
        OutputFormat = OutputFormat.Jpeg,
        JpegQuality = 85
    };

    ImageBuilder.Current.Build(new ImageJob(image, outputStream2, instructions2));
    outputStream2.Seek(0, SeekOrigin.Begin);

    imageMedium.Properties.ContentType = "image/jpeg";
    imageMedium.UploadFromStream(outputStream2);

}

因此,当前正在执行的操作是触发图像上传,通过将大小调整为小尺寸的第一步,但是当它到达将大小调整为中等大小的代码时,它给出了错误@987654322 @

所以我怀疑我原来的Stream image 被关闭了?或丢弃,这样当我尝试使用ImageBuilder.Current.Build(new ImageJob(image, outputStream2, instructions2)); 时,这无效?

希望这很容易解决。我的替代方法(并且可行)是具有 2 个函数,一个调整小号的大小,一个调整大号的大小。

【问题讨论】:

    标签: c# azure azure-functions outputstream


    【解决方案1】:

    为了缩放和其他目的,我推荐两个函数。在第一次调整大小后寻找源流可能是一个问题,具体取决于您用于输入流的绑定和技术。

    我个人创建了一个类似的解决方案,我首先将源流读取到 MemoryStream,然后在 MemoryStream 上执行多个操作,以解耦源流能力(寻找等)。

    这可能会增加您的内存占用,您可以尝试通过 RecyclableMemoryStream (https://github.com/Microsoft/Microsoft.IO.RecyclableMemoryStream) 等解决方案再次将其最小化

    【讨论】:

    • 感谢您的反馈。现在我已经设法弄清楚如何使用我现有的代码,但要记住分开。我要实现的目标还有另一层复杂性,因此目前保持一种方法可能是唯一的方法。
    • 听起来不错。考虑合并或回收您的“输出流”,以减少函数应用的内存占用。
    【解决方案2】:

    好的,所以发现ImageJob 有一个接受bool disposeSource 的重载,所以我更新了我的代码;

    ImageBuilder.Current.Build(new ImageJob(image, outputStream, instructions, false, false));

    这样我第二次想使用image它仍然对我可用。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2019-08-20
      • 2019-02-02
      • 1970-01-01
      • 2015-06-16
      • 2011-08-30
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多