Почему в WriteableBitmap нельзя писать байты изображения напрямую? - PullRequest
0 голосов
/ 14 июня 2019

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

    void DrawUI(ref byte[] frameBody)
    {
        try
        {
            writeableBitmap.WritePixels(new Int32Rect(0, 0, 1080, 1920), frameBody, writeableBitmap.BackBufferStride, 0);
        }
        catch(Exception e)
        {
            Console.WriteLine($"catch a exception {e.Message}");
        }

    }

Когда я изменяю его ниже, это нормально для работы, вопрос в том, что я не хочу делать какое-либо преобразование, потому что скорость имеет значение.

    void DrawUI(ref byte[] frameBody)
    {
        try
        {
            BitmapSource bms = (BitmapSource)new ImageSourceConverter().ConvertFrom(frameBody);
            var bytesPerPixel = bms.Format.BitsPerPixel / 8;
            var stride1 = bms.PixelWidth * bytesPerPixel;
            byte[] pixels2 = new byte[1080 * 1920 * stride1];
            writeableBitmap.WritePixels(new Int32Rect(0, 0, 1080, 1920), pixels2, stride1, 0);
        }
        catch(Exception e)
        {
            Console.WriteLine($"catch a exception {e.Message}");
        }
    }

определяется writeableBitmap:

writeableBitmap = new WriteableBitmap(
                                  //(int)p.win.ActualWidth,//DPI相关
                                  //(int)p.win.ActualHeight,//DPI相关
                                  1080,
                                  1920,
            300,
            300,
            PixelFormats.Bgr32,
            null);

1 Ответ

1 голос
/ 14 июня 2019

Если строка

BitmapSource bms = (BitmapSource)new ImageSourceConverter().ConvertFrom(frameBody);

успешно создает BitmapSource, аргумент frameBody не содержит необработанный пиксельный буфер.Вместо этого это кодированный кадр изображения, например PNG, JPEG, BMP или аналогичный.

Неясно, почему вы думаете, что вам нужен WriteableBitmap вообще.Просто присвойте bms свойству Source элемента Image:

private void DrawUI(byte[] frameBody)
{
    try
    {
        var bms = (BitmapSource)new ImageSourceConverter().ConvertFrom(frameBody);

        image.Source = bms;
    }
    catch (Exception e)
    {
        Debug.WriteLine($"catch a exception {e.Message}");
    }
}

Если действительно необходимо, вы также можете легко контролировать размер декодированного растрового изображения, создав BitmapImage и установив его DecodePixelWidth илиDecodePixelHeight свойство:

private void DrawUI(byte[] frameBody)
{
    try
    {
        var bitmap = new BitmapImage();

        using (var stream = new MemoryStream(frameBody))
        {
            bitmap.BeginInit();
            bitmap.DecodePixelWidth = 1080;
            bitmap.CacheOption = BitmapCacheOption.OnLoad;
            bitmap.StreamSource = stream;
            bitmap.EndInit();
        }

        image.Source = bitmap;
    }
    catch (Exception e)
    {
        Debug.WriteLine($"catch a exception {e.Message}");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...