我正在尝试在存储为字节数组的图形上绘制线条,然后在Windows 10通用应用程序中另存为jpg。
我有一个字节[],我已经将其转换为位图图像以获取像素大小
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();
}
不幸的是,生成的图像只是一条细细的水平颜色线。原始图像丢失,不显示黑线。
我是图形编程的新手,代码片段基本上只是我从各种来源拼凑起来的零碎片段。
任何帮助,不胜感激。
我没有发现您的编码代码有任何问题。只要您有有效的原始数据来创建初始可写位图,它就应该可以工作。
我的猜测是错误来自您正在加载的图像数据,这些数据无效。某些内容可能已损坏/保存不正确。您可以尝试显示您的位图图像,看看它是否正确加载。您还可以使用 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();
解决了!
改变:
WriteableBitmap writeableBmp = BitmapFactory.New(bImage.PixelWidth, bImage.PixelHeight).FromByteArray(myByteArray);
自:
WriteableBitmap writeableBmp = BitmapFactory.New(bImage.PixelWidth, bImage.PixelHeight).FromStream(new MemoryStream(myByteArray));