Функции Azure Изменение размера большого двоичного объекта с помощью двух выходных больших двоичных объектов - PullRequest
0 голосов
/ 24 октября 2018

У меня есть функция 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);

}

Итак, в данный момент выполняется загрузка изображения, первый шаг - изменение размера до небольшого размера, но затем -код для изменения размера до среднего, он выдает ошибку Error: my-vehicle-image.jpg Parameter is not valid.

Так что я подозреваю, что мой оригинальный Stream image закрывается?или утилизировать, так что когда я пытаюсь использовать ImageBuilder.Current.Build(new ImageJob(image, outputStream2, instructions2));, это недопустимо?

Надеюсь, это легко исправить.Моя альтернатива, и она работает, состоит в том, чтобы иметь 2 функции, одна из которых изменяет размер маленькой, а другая - большого.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Хорошо, обнаружил, что ImageJob имеет перегрузку, которая принимает bool disposeSource, поэтому я обновил свой код так:

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

Таким образом, во второй раз, когда я хочуиспользовать image это все еще доступно для меня.

0 голосов
/ 24 октября 2018

Для масштабирования и других целей я бы рекомендовал две функции.Поиск исходного потока после первого изменения размера может быть проблемой в зависимости от привязки и технологии, которую вы используете для входного потока.

Лично я создал аналогичное решение, в котором сначала считываю исходный поток в MemoryStream, а затем выполняю несколько операций с MemoryStream, отделяя возможности исходного потока (поиск и т. Д.).

Это, возможно, увеличивает объем памяти, который вы можете попытаться снова минимизировать с помощью таких решений, как RecyclableMemoryStream (https://github.com/Microsoft/Microsoft.IO.RecyclableMemoryStream)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...