0

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

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

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 используя

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(); 
} 

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

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

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

ответ

0

Я не нашел ничего неправильного в коде кодировки. До тех пор, пока у вас есть действительные необработанные данные, чтобы создать исходный файл 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(); 
0

Решенный!

Изменено:

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

к:

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