【问题标题】:WriteableBitmap to Base64 c#WriteableBitmap 到 Base64 c#
【发布时间】:2016-05-17 13:13:56
【问题描述】:

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

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

我应该将图像编码为 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 对其进行解码,则 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);
        }

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

【问题讨论】:

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


【解决方案1】:

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

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

    }

【讨论】:

  • 感谢您的回答,但我已经尝试过此解决方案,它给了我类似“CxMS/wsTEv8NEhH/DRIR/xEREf8RERH/FRAR/xQPEP8UDxD/FA8Q/xQPEP8UDxD/EhAQ/xIQEP8QEBD/EBAQ/ xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/" 但我无法使用在线解码器或服务器端的 Convert.FromBase64String 对其进行解码。我不知道该怎么办:/
  • 好的,我有消息了。我尝试发送此字符串时遇到的错误是因为字符串太大。我在发送过程中调整了图片的大小,一切都很好。现在的问题是,当我在服务器端对其进行解码并保存时,我的文件已损坏。
  • @benoitrastier 请删除它并编辑您的问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多