在WriteableBitmap上绘制Windows通用应用程序

时间:2016-02-24 11:40:02

标签: windows graphics windows-10 win-universal-app writeablebitmap

我正在尝试在图形上绘制线条,我将其存储为字节数组,然后在我的Windows 10通用应用程序中另存为jpg。

我有一个byte [],我已将其转换为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();
}

遗憾的是,生成的图像只是一条细长的颜色。原始图像丢失,未显示黑线。

我是图形编程的新手,代码片段基本上只是我从各种来源整理的点点滴滴。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

解决!

更改:

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

为:

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