UWP Ink Strokes отправлены в службу WCF. Результат черного / пустого изображения - PullRequest
0 голосов
/ 31 августа 2018

Я не уверен, как это спросить. У меня есть приложение UWP, которое фиксирует чернильные штрихи в виде больших двоичных объектов и отправляет их в службу, которая декодирует их обратно в 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(); }
    }

enter image description here enter image description here

Строка "R01GOD1" была преобразована в изображение и затем закодирована обратно в строку "iVBOR" с использованием сайта "http://freeonlinetools24.com/base64-image"

ОБНОВЛЕНИЕ 2

Ниже приведен пример кода процесса, который я использую в своем UWP для преобразования чернильного контейнера в строку base64, которую я затем могу отправить в службу.

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

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вот решение.
Оба формата строки Base64 работают. Последний формат, созданный приложениями UWP, можно прочитать только как Bitmap. Если вы попытаетесь прочитать Ink Strokes как Image, вы получите черный ящик.

public static Bitmap ConvertBase64ToBitmap(string base64String)
{
    byte[] stringBytes = Convert.FromBase64String(base64String);
    Bitmap bitmap;
    using (MemoryStream ms = new MemoryStream(stringBytes))
    {
        bitmap = new Bitmap(ms);
    }
    return bitmap;
}

Если вы не хотите иметь дело с растровыми изображениями на стороне сервера / службы, то вы можете конвертировать чернила в виде изображения и свободно сохранять их в виде байтового массива или строки base64 или чего-либо еще.

public static async Task<string> WriteInkAsPngToBase64(InkStrokeContainer ink)
{
    SoftwareBitmap sbmp;
    byte[] byteResults = null;
    string base64String = null;
    // inStream is the IRandomAccessStream with the GIF data (filled from InkStrokeContainer.SaveAsync)
    // outStream is an IRandomAcccessStream to save the PNG data
    //                                                                              -Rob Caplan - MSFT
    InMemoryRandomAccessStream inStream = new InMemoryRandomAccessStream();
    InMemoryRandomAccessStream outStream = new InMemoryRandomAccessStream();
    await ink.SaveAsync(inStream);
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(inStream);
    sbmp = await decoder.GetSoftwareBitmapAsync();
    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, outStream);
    encoder.SetSoftwareBitmap(sbmp);

    await encoder.FlushAsync();
    byteResults = new byte[outStream.Size];
    using (DataReader reader = new DataReader(outStream.GetInputStreamAt(0)))
    {
        await reader.LoadAsync((uint)outStream.Size);
        reader.ReadBytes(byteResults);
    }
    base64String = Convert.ToBase64String(byteResults);
    return base64String;
}
0 голосов
/ 06 сентября 2018

Для декодирования Base64 строки в UWP, вы можете использовать класс CryptographicBuffer для декодирования или кодирования данных.

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

Затем вы можете использовать следующий код для преобразования buffer в bitmapimage.

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

Для более подробной информации вы можете обратиться Кодировать и декодировать данные документ.

...