Альтернатива растровому изображению (System.Drawing) в универсальном приложении Windows

Я разрабатываю универсальное приложение для Windows, которое будет работать на архитектуре ARM (RaspberryPi 3, ОС: Windows IoT).

Проблема, с которой я столкнулся, заключается в том, что UWP не поддерживает множество стандартных библиотек .Net, таких как "System.Drawing".

В настоящее время у меня есть IntPtr, который содержит необработанные данные для изображения, и мне нужно использовать его как Bitmap, что, конечно, невозможно в этом сценарии. Возможна ли ему альтернатива.

Я искал BitmapImage, но не нашел для него решения.

Я также пытался преобразовать IntPtr в Byte[], но затем преобразовать массив в Image или BitmapImage невозможно. в УВП.

Пожалуйста, полегче со мной, так как я новичок в программировании на C #.

Все, что мне нужно, это любой тип растрового изображения или изображения из IntPtr.

Заранее спасибо!


person Syed Ali Raza    schedule 24.03.2017    source источник
comment
stackoverflow.com/ вопросы/34837456/   -  person schulmaster    schedule 24.03.2017
comment
Это не относится к моему вопросу. Мне нужно изображение из IntPtr...   -  person Syed Ali Raza    schedule 24.03.2017


Ответы (2)


Чтобы преобразовать IntPtr в Byte[], мы можем использовать метод Marshal.Copy. Он копирует данные из одномерного управляемого 8-битного целочисленного массива без знака в неуправляемый указатель памяти.

Затем мы можем использовать WriteableBitmap, чтобы установить для Byte[] значение WriteableBitmap.

Исходные данные изображения WriteableBitmap — это базовый пиксельный буфер. PixelBuffer нельзя записывать напрямую, однако вы можете использовать методы, специфичные для языка, для доступа к буферу и изменения его содержимого.

Чтобы получить доступ к содержимому пикселя из C# или Microsoft Visual Basic, вы можете использовать метод расширения AsStream для доступа к базовому буферу в виде потока.

Дополнительные сведения см. в разделе Примечания из WriteableBitmap.

Чтобы преобразовать WriteableBitmap в BitmapImage, мы должны иметь возможность кодировать поток из WriteableBitmap.

Например:

private byte[] managedArray;

private async void Button_Click(object sender, RoutedEventArgs e)
{
    Windows.Storage.Streams.IRandomAccessStream random = await Windows.Storage.Streams.RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/sunset.jpg")).OpenReadAsync();
    Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(random);
    Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
    byte[] buffer = pixelData.DetachPixelData();
    unsafe
    {
        fixed (byte* p = buffer)
        {
            IntPtr ptr = (IntPtr)p;
            managedArray = new byte[buffer.Length];
            Marshal.Copy(ptr, managedArray, 0, buffer.Length);
        }
    }
    WriteableBitmap bitmap = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
    await bitmap.PixelBuffer.AsStream().WriteAsync(managedArray, 0, managedArray.Length);
    InMemoryRandomAccessStream inMemoryRandomAccessStream = new InMemoryRandomAccessStream();
    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, inMemoryRandomAccessStream);
    Stream pixelStream = bitmap.PixelBuffer.AsStream();
    byte[] pixels = new byte[pixelStream.Length];
    await pixelStream.ReadAsync(pixels, 0, pixels.Length);
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96.0, 96.0, pixels);
    await encoder.FlushAsync();
    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.SetSource(inMemoryRandomAccessStream);
    MyImage.Source = bitmapImage;
}
person Jayden    schedule 27.03.2017

Я хотел добавить больше, но пока не могу редактировать комментарии, и SO автоматически сделал мой первоначальный ответ комментарием. В основном похоже, что ваше затруднительное положение является распространенным, но вам нужно изучить стороннее решение.

person schulmaster    schedule 24.03.2017