WriteableBitmap到Base64 c#

时间:2016-05-17 13:13:57

标签: c# web-services base64 win-universal-app

首先,我很抱歉我的英语不好。

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

我应该将图像编码为web服务可以解码的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对其进行解码,则webservice会返回错误“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);
        }

服务器上的解码提供完整的图像。 感谢。

2 个答案:

答案 0 :(得分:0)

是否有理由对图像进行编码?,试试这个。

    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);
        }

    }

答案 1 :(得分:0)

尝试使用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/