Универсальное приложение для Windows рисует на WriteableBitmap

Я пытаюсь рисовать линии на графике, который я сохранил в виде массива байтов, а затем сохранить как jpg в своем универсальном приложении Windows 10.

У меня есть байт [], который я преобразовал в растровое изображение, чтобы получить размер пикселя, используя

BitmapImage bImage;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
    using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
    {
        writer.WriteBytes(myByteArray);
        await writer.StoreAsync();
    }

    bImage = new BitmapImage();
    bImage.SetSource(ms);
}

Затем я создал записываемый битмап, используя

WriteableBitmap writeableBmp = BitmapFactory.New(bImage.PixelWidth, bImage.PixelHeight).FromByteArray(myByteArray);

Затем я рисую линию на графике

writeableBmp.DrawLine(10, 10, 200, 10, Colors.Black);

а потом сохранить как jpg

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("graphic.jpg");

using (var storageStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, storageStream);
    var pixelStream = writeableBmp.PixelBuffer.AsStream();
    var pixels = new byte[pixelStream.Length];
    await pixelStream.ReadAsync(pixels, 0, pixels.Length);

    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableBmp.PixelWidth, (uint)writeableBmp.PixelHeight, 48, 48, pixels);
    await encoder.FlushAsync();
}

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

Я новичок в графическом программировании, и фрагменты кода в основном представляют собой просто кусочки, которые я собрал из разных источников.

Любая помощь приветствуется.


person Community    schedule 24.02.2016    source источник


Ответы (2)


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

Я предполагаю, что ошибка возникает из-за того, что данные изображения, которые вы загружаете, недействительны. Что-то может быть повреждено/неправильно сохранено. Вы можете попробовать отобразить свой BitmapImage и посмотреть, правильно ли он загружается. Вы также можете использовать BitmapImage. ImageFailed для этого. Вы также можете проверить, действительно ли вы извлекаете некоторые данные из своего потока, либо проверив длину потока, либо проверив, установлен ли курсор в позиции 0, прежде чем читать его.

Вот пример кода, который генерирует необработанное изображение и рисует на нем.

var width   = 35;
var height  = 35;
var imageData   = new byte[width * height * 4];
for(var i = 0; i < imageData.Length; i += 4)
{
    imageData[i]    = 255;
    imageData [i+1] = 0;
    imageData [i+2] = 0;
    imageData [i+3] = 255;
}

var image           = BitmapFactory.New(width, height).FromByteArray(imageData);        // source image data is ARGB
image.DrawLine(0,0, width -1, height -1, Colors.Red);

var file            = await ApplicationData.Current.LocalFolder.CreateFileAsync("output.jpg", CreationCollisionOption.ReplaceExisting);
var outstream       = await file.OpenAsync(FileAccessMode.ReadWrite);

var encoder         = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, outstream);
var outImageData    = image.PixelBuffer.ToArray();

encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint) image.PixelWidth, (uint) image.PixelHeight, 96, 96, outImageData);
await encoder.FlushAsync();
outstream.Dispose();
person Vincent    schedule 24.02.2016

Решено!

Измененный:

WriteableBitmap writeableBmp = BitmapFactory.New(bImage.PixelWidth, bImage.PixelHeight).FromByteArray(myByteArray);

to:

WriteableBitmap writeableBmp = BitmapFactory.New(bImage.PixelWidth, bImage.PixelHeight).FromStream(new MemoryStream(myByteArray));
person Community    schedule 24.02.2016