我正在尝试在图形上绘制线条,我将其存储为字节数组,然后在我的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);
}
然后我使用
创建了一个writeablebitmapWriteableBitmap 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 :(得分: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));