Как использовать CanvasBitmap.CreateFromBytes с байтом [], полученным из изображения jpg - PullRequest
1 голос
/ 10 июля 2019

У меня есть изображение JPG, доступное как байт [] в памяти.

Мне нужно создать CanvasBitmap для рисования этого изображения, которое в конечном итоге создает CompositionDrawingSurface, который я могу назначить своему SpriteVisual. И мне нужен сверхбыстрый метод, чтобы сделать это !!

Я успешно выполнил задачу, используя CanvasBitmap.LoadAsync(ICanvasResourceCreator, IRandomAccessStream), но этот подход занимает слишком много времени (более 10 миллисекунд), а при использовании CanvasBitmap.CreateFromBytes(ICanvasResourceCreator, byte[], int, int, DirectXPixelFormat) это просто занимает 1 миллисекунду, что соответствует моим требованиям к производительности.

К сожалению, при использовании CanvasBitmap.CreateFromBytes результатом будет не правильное изображение, а скорее облако точек, что заставляет меня думать, что существует проблема в кодировании / декодировании изображения.

Вот код, который я пробовал:

byte[] imgBytes = await ReadBinaryFile(path); // read the binary content of a JPG image, for the example purpose (in the real environment, the byte[] comes from in memory caches...)

using (CanvasBitmap canvasBitmap = CanvasBitmap.CreateFromBytes(s_canvasDevice, imgBytes, 600, 800, DirectXPixelFormat.B8G8R8A8UIntNormalized))
{
    // Draw the image to the surface
    using (CanvasDrawingSession session = CanvasComposition.CreateDrawingSession(surface))
    {
        session.Clear(Color.FromArgb(0, 0, 0, 0));
        session.DrawImage(canvasBitmap, new Rect(0, 0, 600, 800), new Rect(0, 0, 600, 800));
    }
}

Что мне не хватает? Как я могу обработать byte[] imgBytes, чтобы он мог быть полезен как ввод CanvasBitmap.CreateFromBytes?

Спасибо!

1 Ответ

1 голос
/ 10 июля 2019

Сначала необходимо преобразовать формат JPEG (сжатый) в необработанный байтовый массив.Вы не можете напрямую прочитать изображение JPEG с диска с помощью ReadBinaryFile() и отобразить его.

Я предполагаю, что большая часть проблемы с производительностью возникает из-за того, что LoadAsync() требуется для распаковки JPEG,Вероятно, вы могли бы улучшить производительность, сохранив другой несжатый формат изображения.


Кроме того, если вам действительно нужно читать JPEG-файлы или он все еще медленный даже с другими форматами изображений: возможно, некоторыеспособ использовать LoadAsync() для загрузки нескольких файлов параллельно.Но я не знаю, как это сделать, и это может быть не очень полезно, если вы все равно оказались узкими местами из-за файлового ввода-вывода.Просто мысль.

...