如何在UWP中将RednerTargetBitmap图像转换为byteArray上传到服务器
本文关键字:byteArray 服务器 转换 图像 UWP 中将 RednerTargetBitmap | 更新日期: 2023-09-27 18:01:48
我有一个覆盖整个屏幕的网格,我想把这个网格作为图像,然后这个图像我想发送到服务器上。为此,我使用了RenderTargetBitmap,并成功地使用FileSave Picker使writeablebitmap保存。图像保存是正常大小,如预期的700kb,但这些字节太大,无法上传到服务器。700kb图像的预期字节数可能是20万,但在我的情况下,字节数超过30万。字节肯定有问题。下面是我使用文件保存选择器将网格保存为图像的代码。
await bitmap.RenderAsync(testgrid);
var pixelBuffer = await bitmap.GetPixelsAsync();
byte[] pixels = pixelBuffer.ToArray();
var wb = new WriteableBitmap((int)bitmap.PixelWidth, (int)bitmap.PixelHeight);
using (stream2 = wb.PixelBuffer.AsStream())
{
await stream2.WriteAsync(pixels, 0, pixels.Length);
}
FileSavePicker picker = new FileSavePicker();
picker.FileTypeChoices.Add("JPG File", new List<string>() { ".jpg" });
StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
await (wb as WriteableBitmap).SaveAsync(file);
}
以上代码成功地将图像保存到正常大小的指定位置。但当我使用以上像素字节数组服务器。Http发送任务取消异常,而发送请求,我有详细检查它。这是由于字节数组的巨大数量。另外,如果我发送一个非常小的50x50的网格,那么上传就成功了,因为它只有3万字节,但上传到服务器上的图像是空的或损坏的。
我也使用了上面的转换writeablebitmap,使其字节数组使用这个方法…
using (Stream stream = mywriteablebitmap.PixelBuffer.AsStream())
using (MemoryStream memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
它也返回相同字节数的数组和从服务器发生的相同错误。
请告诉我从RenderTargetBitmap制作字节数组的正确方法,并且可以很容易地上传到服务器上
,但当我使用以上像素字节数组服务器。Http发送任务取消异常,而发送请求,我有详细检查它。这是由于字节数组的数量太大。
我完全同意Clemens,你需要在上传之前对你的图像进行编码。您可以使用以下代码对图像进行编码:
private async Task<String> ToBase64(byte[] image, uint height, uint width, double dpiX = 96, double dpiY = 96)
{
var encoded = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, encoded);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, height, width, dpiX, dpiY, image);
await encoder.FlushAsync();
encoded.Seek(0);
var bytes = new byte[encoded.Size];
await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length);
var base64String=Convert.ToBase64String(bytes);
return base64String;
}
并在你的代码中调用它:
var pixelBuffer = await bitmap.GetPixelsAsync();
byte[] pixels = pixelBuffer.ToArray();
await ToBase64(pixels, (uint)bitmap.PixelHeight, (uint)bitmap.PixelWidth);
有关在WinRT中编码图像的详细信息,请参见在Windows运行时中读写Base64。
经过大量搜索后,我将renderTargetBitmap保存到isolatedstorage中,然后从存储中访问图像文件,并使用此方法制作其流字节数组。
var stream = await imageStorageFile.OpenStreamForReadAsync();
imageBytes=ReadFully(stream);
public byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}