首页 > 解决方案 > UWP 墨水笔画发送到 WCF 服务。黑色/空白图像结果

问题描述

我不知道怎么问这个。我有一个 UWP 应用程序,它将墨迹笔画捕获为 BLOB,并将它们发送到将它们解码回 PNG 或其他图像格式的服务。

最初的墨水笔画效果很好。我能够捕获墨水并将其转换回图像。但最近我注意到墨水笔画仍然保存到 BLOB 中,只是不是我可以解码的。

这些是我习惯看到的 BLOB 类型......

iVBORw0KGgoAAAANSUhEUgAAB0QAAAUvCAYAAAAhI1YPAAAAAXNSR0IArs4c[...]FOl/H86CXiFEsRU5ErkJggg==

这些是我现在看到的 BLOB...

R0lGODlhjgHCAHAAACH5BAEAAAMALAAAAACOAcIAgQAAA/wAA/gAAAAL/nI+py+0[...]AAAAAAAAKjUQlzgAAAAA7

我尝试在使用时以各种格式类型保存图像

Convert.FromBase64String()

将 BLOB 转换为可管理的字节数组,但到目前为止没有任何效果。我知道新的 BLOB 是有效的,因为一些在线 base64 解码器能够生成我期望的图像。有没有人见过这些类型的 BLOB 并知道如何正确解码它们?

更新(按要求)

    public static void SampleForStackOverflow()
    {
        byte[] bytes = Convert.FromBase64String("R0lGODlhFgATAHAAACH5BAEAAAMALAAAAAAWABMAgQAAAAAA/gAA/wAAAAI1nI8jku262JtR0nWqia16DIHb542cSVohqJWJtk7Z6V7iZ6tkB88pzvv1gj8ZamhMKpdMQwEAIf7+APwGHQI+MAGQAUHz8wD2Xq9JmbmrFj3xo/prOzC0FlISTovE2rgnfpcOi5xAxOBymESobsE+RUdbqbyTWz0uFlZJn7lelx8qfs7F9U74cWifSZkoUdpAYWqcbZ8HKXZVEkaLBcUmKA0Ge1VU2H4I/0FAq4WFLM14HhihTILQiG6VQLRDsmlYT9TvL8nWZfDiqk2TFsUtPs+g3gMsSBVkBj8ACAACDRBlAhKIAGYCEogCRICA/AdFaGcCMpgAaAY+AE+pgAAARmgFBzg2C2lqa2wZHDIJAP7/BwEAwB5FMwkA/v8HAQDAHkU4BAD+/wEKjQVEg/yTX5JsCZmblYL+Kx34zERUUqqpw5cuXLGpXc3c73njvOc3bICD/EHfiDwOGqipmc3N3JuZhWKrUVV55cKxM3x473xzvObiUxNKqMCC/vuL++4wAAAAAAAAAACHeFLzwVgcQ1w1fBycRryn3Oz81NhfgSuKx4pLh7+HK4ePgXeGW40PkOOVZ5Wrk1+Q24CThJ9IVC2YzsPG38ipw6/BdcZnxvXDLcTTwfWN+Ct4jDkU+KO5KfkYuFzm2y+Fh5eDgJeGm4AHQufOMD4yjgAeFF0poDiLeTG493jNgIIDAAQgAADAQBWL5EEAAIBBAAAAQAAAAAAAAAAANPLkQQAAgEEAAABAAAAAAAD+AAAAcwrgQbPCjkEAAABAAAAAAAAAAABcjd9BAsyPQQAAAEAAAAAAAAAAAEPL00FyvKhBAAAAQAAAAAAAAAAAsyTDQSSqn0EAAABAAAAAAAAAAAAkUq5BZWmaQQAAAEAAAAAAAAAAAC7TlEHU+pNBAAAAQAAAAAAAAAAA/leWQZ0esUEAAABAAAAAAAAAAACyuaFBKIe+QQAAAEAAAAAAAAAAAB9/vEHsEN5BAAAAQAAAAAAAAAAAxo8AQoC1+UEAAABAAAAAAAAAAADTEw5CYjHKQQAAAEAAAAAAAAAAALztEkJfI7lBAAAAQAAAAAAAAAAA7WwOQqsHo0EAAACFQAAAAAAAAAAA8pkHQsdtl0EAAABAAAAAAAAAAAAU/AZCZ2GWQQAAAEAAAAAAAAAAAEVnBkIyeZVBAAAAQAAAAAAAAAAAd9IFQv6QlEEAAABAAAAAAAAAAAAKABQAsJ570CZF1AEKPwApY/AC0AAAAAASABUgAQAAAAAAAACo9jWkYAAAAAA7");
        byte[] bytes2 = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAABYAAAATCAYAAACUef2IAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACJSURBVDhP3ZFbCsAgDAS197+zRRLw0V2TqF8dKIKYcd2mGKXIZ5N1dTAL83L20fU60619qj4RS8vOD2JfdwISV5pcq4hIVzTPRsf9k8fnCyInYjRQQfv4rG7yrnx850ni885VzLrav2ASrkSsHjSTWdITxAk6jv44jCGJpm+hnOmsC+688pek9AJuQCoVPgMNJwAAAABJRU5ErkJggg==");
        Image image, image2;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms, true);
        }
        using (MemoryStream ms2 = new MemoryStream(bytes2))
        {
            image2 = Image.FromStream(ms2, true);
        }
        image.Save("image.png");
        image2.Save("image2.png");

        if (image != null)
        { image.Dispose(); }
        if (image2 != null)
        { image2.Dispose(); }
    }

在此处输入图像描述 在此处输入图像描述

“R01GOD1”字符串被转换为图像,然后使用网站“ http://freeonlinetools24.com/base64-image ”编码回“iVBOR”字符串

更新 2

这是我在 UWP 中用于将 inkstrokecontainer 转换为 base64string 的过程的代码示例,然后我可以将其发送到我的服务。

    private async static Task<string> WriteInkToBase64String(Windows.UI.Input.Inking.InkStrokeContainer inkContainer)
    {
        byte[] data;
        Stream s = null;
        MemoryStream ms = new MemoryStream();
        Windows.Storage.Streams.InMemoryRandomAccessStream imras = new Windows.Storage.Streams.InMemoryRandomAccessStream();
        try
        {
            await inkContainer.SaveAsync(imras);
            s = imras.AsStream();
            s.Position = 0;
            s.CopyTo(ms);
            data = ms.ToArray();
        }
        finally {
            ms.Dispose();
            if (s != null)
                s.Dispose();
            imras.Dispose();

        }
        return Convert.ToBase64String(data);
    }

标签: uwpbase64blobstroke

解决方案


对于Base64UWP 中的解码字符串,您可以使用CryptographicBuffer类来解码或编码数据。

IBuffer buffer = CryptographicBuffer.DecodeFromBase64String("R0l==")

然后,您可以使用以下代码转换bufferbitmapimage.

using (IRandomAccessStream randomAccessStream = buffer2.AsStream().AsRandomAccessStream())
{
    var bitmapimage = new BitmapImage();
    await bitmapimage.SetSourceAsync(randomAccessStream);
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         image1.Source = bitmapimage;
     });
}

有关更多详细信息,您可以参考编码和解码数据文档。


推荐阅读