Кодированный пользовательский интерфейс C # - как загрузить захваченное изображение в контейнер хранения Azure - PullRequest
0 голосов
/ 16 мая 2018

Какой способ загрузки захваченного изображения в хранилище Azure используется в методе тестирования закодированного пользовательского интерфейса, а не на локальном диске?

Чтобы сохранить захваченное изображение в локальный файл, я делаю следующее, он отлично работает:

BrowserWindow window = new BrowserWindow();
Image cml1 = window.CaptureImage();
cml1.Save(screenshotDir + screenshotDirClickMainLinks + "1" + 
CMLelectAndNaturalGas + DateTime.Now.ToString(dateTime) + fileSuffix); 

Как загрузить «cml1» в хранилище Azure, не сохраняя его в локальном файлепривод?Преобразовать ли cml1 one в поток, который можно ввести в объект хранилища Azure?Эта ссылка содержит некоторую информацию, но не говорит о хранилище Azure.Эта ссылка имеет метод «UploadFromStream» для CloudBlockBlob, но пример не приводится.

Для хранилища Azure я знаю , как создать контейнер и загрузить локальный файл в этот контейнер.Вот фрагмент кода:

if (CloudStorageAccount.TryParse(storageConnectionString, out storageAccount))
{
    // Get the reference of the storage blob
    CloudBlobClient client = storageAccount.CreateCloudBlobClient();

    CloudBlobContainer container = client.GetContainerReference("testresult");

     container.CreateIfNotExists();

CloudBlockBlob cloudBlockBlob = container.GetBlockBlobReference(localFileName);
cloudBlockBlob.UploadFromFile(sourceFile);

// Uploading second file

CloudBlobContainer container2 = client.GetContainerReference("testresult");
            container2.CreateIfNotExists();


CloudBlockBlob cloudBlockBlob2 = container2.GetBlockBlobReference(localFileName2);
cloudBlockBlob2.UploadFromFile(sourceFile2);

}

Как использовать ссылку «cml1» для прямой загрузки захваченного изображения в хранилище Azure без предварительного сохранения его в локальной папке?

Спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Выходные данные, возвращаемые BrowserWindow.CaptureImage, представляют собой System.Drawing.Image (тип вашей переменной cml1), который можно преобразовать в byte[], используя описанную технику, например, здесь или лучше сжать изображение до более краткого формата, такого как .PNG:

public static byte[] ImageToByte(Image img)
{
    using (var stream = new MemoryStream())
    {
        img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
        return stream.ToArray();
    }
}

Кредит: приведенный выше код взят непосредственно из этого Ответа StackOverflow здесь

Получив массив byte[], вы можете напрямую загрузить его в свой контейнер Blobstorage, используя подход, аналогичный тому, который вы пробовали, но с использованием более прямого CloudBlockBlob.UploadFromByteArrayAsync метода * 1023. *.

public async Task SaveBlob(string containerName, string key, byte[] blobToSave)
{
  var blobClient = _storageAccount.CreateCloudBlobClient();
  var blobContainer = blobClient.GetContainerReference(containerName);
  await blobContainer.CreateIfNotExistsAsync();
  var blockBlob = container.GetBlockBlobReference(key);
  await blockBlob.UploadFromByteArrayAsync(blobToSave, 0, blobToSave.Length);
}

Где _storageAccount - это CloudStorageAccount, проанализированный из строки подключения к учетной записи хранилища Azure, containerName - это имя контейнера (папки) (в нижнем регистре), key - это уникальное имя файла для вашего изображения, и курс blobToSave - это байтовый массив, который вы только что преобразовали.

Замечание по производительности - если вы храните несколько больших двоичных объектов в одной и той же ссылке на контейнер, вам не нужно каждый раз выполнять проверку CreateIfNotExists(Async) - в идеале, делать однократную проверку во время начальной загрузки, когда ваше приложение или тест запущен.

...