繁体   English   中英

WriteableBitmap到Base64 C#

[英]WriteableBitmap to Base64 c#

首先,对不起我的英语不好。

我在这个项目上工作了几天,没有解决任何问题。 我尝试将图片从我的UWP应用程序发送到c#中的Web服务。 我在一个Android应用程序中完成了这件事,没有任何问题。

我应该将图像编码为base64字符串,网络服务可以将其解码。

我有两个问题,第一个问题是,如果我尝试(使用在线解码器)对我的base64字符串进行解码,那么此代码给了我类似的东西。

在图像中,我们可以看到它并没有显示整个图片。

我用以下代码将其写入base64:

private async void ToBase64(WriteableBitmap img)
{
    var encoded = new InMemoryRandomAccessStream();

    // Copy buffer to pixels
    byte[] pixels;
    using (var stream = img.PixelBuffer.AsStream())
    {
        pixels = new byte[(uint)stream.Length];
        await stream.ReadAsync(pixels, 0, pixels.Length);
    }

    var encoder = await BitmapEncoder
        .CreateAsync(BitmapEncoder.PngEncoderId, encoded);
    encoder.SetPixelData(BitmapPixelFormat.Bgra8,
        BitmapAlphaMode.Premultiplied, (uint)img.PixelWidth, (uint)img.PixelHeight
        , 96, 96, pixels);
    await encoder.FlushAsync();
    encoded.Seek(0);

    var array = new byte[encoded.Size];
    await encoded.AsStream().ReadAsync(array, 0, array.Length);

    Base64String = Convert.ToBase64String(array);
}

我的第二个问题是,如果我尝试将此Base64发送到我的Web服务并使用FromBase64String对其进行解码,则Web服务将返回错误“ Base64字符串格式不正确”。 我不明白,因为我们可以看到,在线解码器可以对其进行解码,而我在android应用中没有这个问题。

如果您对此问题有任何想法。 我尝试了很多在互联网上看到的事情

谢谢你提前。

编辑1

这是我的解码方法。 此方法适用于通过Android应用发送的Bitmap base64。

[WebMethod]
     public string uploadPhoto(string image)
        {
            byte[] bytes = Convert.FromBase64String(image);

            using (var imageFile = new FileStream("directory+filename", FileMode.Create))
            {
                imageFile.Write(bytes, 0, bytes.Length);
                imageFile.Flush();
            }     

            return number;
        }

编辑2

它适用于以下代码:

public async Task<String> SaveToBytesAsync(ImageSource imageSource)
        {
            byte[] imageBuffer;
            var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
            var file = await localFolder.CreateFileAsync("temp.jpg", CreationCollisionOption.ReplaceExisting);
            using (var ras = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None))
            {
                WriteableBitmap bitmap = imageSource as WriteableBitmap;
                var stream = bitmap.PixelBuffer.AsStream();
                byte[] buffer = new byte[stream.Length];
                await stream.ReadAsync(buffer, 0, buffer.Length);
                BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras);
                encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96.0, 96.0, buffer);
                await encoder.FlushAsync();

                var imageStream = ras.AsStream();
                imageStream.Seek(0, SeekOrigin.Begin);
                imageBuffer = new byte[imageStream.Length];
                var re = await imageStream.ReadAsync(imageBuffer, 0, imageBuffer.Length);
            }
            await file.DeleteAsync(StorageDeleteOption.Default);
            return Convert.ToBase64String(imageBuffer);
        }

服务器上的解码会给出完整的图像。 谢谢。

是否有理由对图像进行编码?请尝试此操作。

    string base64String = await ToBase64Async(bitmap);

    public async Task<string> ToBase64Async(WriteableBitmap bitmap)
    {
        using (Stream stream = bitmap.PixelBuffer.AsStream())
        {
            stream.Position = 0; 
            var reader = new DataReader(stream.AsInputStream());
            var bytes = new byte[stream.Length];
            await reader.LoadAsync((uint)stream.Length);
            reader.ReadBytes(bytes);
            return Convert.ToBase64String(bytes);
        }

    }

尝试使用代码以base64

private async Task<string> ToBase64(Image control)
{
    var bitmap = new RenderTargetBitmap();
    await bitmap.RenderAsync(control);
    return await ToBase64(bitmap);
}

如果您有WriteableBitmap,请尝试使用以下代码:

private async Task<string> ToBase64(WriteableBitmap bitmap)
{
    var bytes = bitmap.PixelBuffer.ToArray();
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight);
}

如果您的图片是SotrageFile,则可以使用

private async Task<string> ToBase64(StorageFile bitmap)
{
    var stream = await bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read);
    var decoder = await BitmapDecoder.CreateAsync(stream);
    var pixels = await decoder.GetPixelDataAsync();
    var bytes = pixels.DetachPixelData();
    return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY);
}

如果您的图片是RenderTargetBitmap

private async Task<string> ToBase64(RenderTargetBitmap bitmap)
{
    var bytes = (await bitmap.GetPixelsAsync()).ToArray();
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight);
}

参见https://codepaste.net/ijx28i

http://lindexi.oschina.io/lindexi/post/win10-uwp-%E8%AF%BB%E5%8F%96%E4%BF%9D%E5%AD%98WriteableBitmap-BitmapImage/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM