如何在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制作字节数组的正确方法,并且可以很容易地上传到服务器上

如何在UWP中将RednerTargetBitmap图像转换为byteArray上传到服务器

,但当我使用以上像素字节数组服务器。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();
        }
    }