Как установить / получить пиксель из Softwarebitmap - PullRequest
0 голосов

Я пытаюсь изменить пиксели с Softwarebitmap.

Я хочу знать, есть ли эквивалент для Bitmap.Get/SetPixel(x,y,color) в Softwarebitmap UWP.

1 Ответ

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

Если вы хотите читать и писать программные бит-карты, то вам следует использовать небезопасный код.

Для использования softwareBitmap сложно написать код.

Сначала используйте некоторый код.

using System.Runtime.InteropServices;

Затем создайте интерфейс

[ComImport]
[Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
    void GetBuffer(out byte* buffer, out uint capacity);
}

Вы можете использовать этот код для изменения пикселя.

Создание мягкого растрового изображения.

        var softwareBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, 100, 100, BitmapAlphaMode.Straight);

Пишущий пиксель.

         using (var buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.ReadWrite))
        {
            using (var reference = buffer.CreateReference())
            {
                unsafe
                {
                    ((IMemoryBufferByteAccess) reference).GetBuffer(out var dataInBytes, out _);

                    // Fill-in the BGRA plane
                    BitmapPlaneDescription bufferLayout = buffer.GetPlaneDescription(0);
                    for (int i = 0; i < bufferLayout.Height; i++)
                    {
                        for (int j = 0; j < bufferLayout.Width; j++)
                        {
                            byte value = (byte) ((float) j / bufferLayout.Width * 255);
                            dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 0] = value; // B
                            dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 1] = value; // G
                            dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 2] = value; // R
                            dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 3] = (byte) 255; // A
                        }
                    }
                }
            }
        }

Вы можете написать пиксель для записи dataInBytes, и вы должны использовать байт.

Для пикселя - BGRA, и вы должны написать этот байт.

Если вы хотите показать это, вам нужно конвертировать, когда BitmapPixelFormat не является Bgra8, а BitmapAlphaMode установлен в Straight, и вы можете использовать этот код.

        if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
            softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight)
        {
            softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
        }

Этот код может показать его изображению.

        var source = new SoftwareBitmapSource();
        await source.SetBitmapAsync(softwareBitmap);
        Image.Source = source;

См .: Создание, редактирование и сохранение растровых изображений - разработчик приложений UWP

...