Сохранение изображения в UWP с последующей загрузкой в ​​WinForms

Доброе утро StackOverflow,

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

Моя проблема в том, что в настоящее время я работаю над двумя разными приложениями. Первое — это приложение UWP для доставки пакетов для внутренней почтовой системы. Идея здесь в том, что при получении пакета человек подпишет приложение, используя подпись InkCanvas. Затем это должно быть сохранено в базе данных в виде массива байтов, а затем перезагружено либо в приложении WinForm, либо в приложении WebForm (сначала я делаю приложение WinForm) как обычный старый файл изображения. Однако я абсолютно застрял на преобразовании между WriteableBitmap, который я получаю от UWP, и обычным Bitmap, который мне нужно загрузить в WinForms. Любые идеи?

Вот что я делаю в настоящее время:

Сохранение образа UWP:

private byte[] SaveImage()
{
    var canvasStrokes = SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes();

    if (canvasStrokes.Count > 0)
    {
        var width = (int) SignatureCanvas.ActualWidth;
        var height = (int) SignatureCanvas.ActualHeight;
        var device = CanvasDevice.GetSharedDevice();
        var renderTarget = new CanvasRenderTarget(device, width, height, 96);

        using (var drawingSession = renderTarget.CreateDrawingSession())
        {
            drawingSession.Clear(Colors.White);
            drawingSession.DrawInk(SignatureCanvas.InkPresenter.StrokeContainer.GetStrokes());
        }
        return renderTarget.GetPixelBytes();
    }
    return null;
}

Затем я сохраняю байты в базе данных и извлекаю их из базы данных в приложении WinForms... значит, я совершаю здесь какую-то глупую ошибку? Я читаю подпись в неправильном формате? Или мне нужно сделать что-то еще, чтобы преобразовать форматы из одного в другой?

Я в тупике, перепробовав много разных результатов со страниц StackOverflow, я не знаю, что делаю неправильно.

Любая помощь будет потрясающей! И извините, если я сделал что-то глупое.


person Alexis    schedule 14.11.2017    source источник


Ответы (1)


На самом деле вы сохраняете необработанные растровые данные в базу данных. Я плохо помню, как работал импортер Winform, но я сомневаюсь, что он может импортировать необработанные растровые данные.

Вы должны сначала закодировать необработанные данные в изображение PNG или JPEG и сохранить результат. Вы получите обычный старый файл изображения, который должен быть доступен для чтения из Winform.

using (IRandomAccessStream stream = /* the stream where you want to save the data */)
{
    byte[] bytes = renderTarget.GetPixelBytes();                

    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
    encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                 BitmapAlphaMode.Ignore,
                                 (uint)canvas.Width, (uint)canvas.Height,
                                 96, 96, bytes);

    await encoder.FlushAsync();
}
person Vincent    schedule 14.11.2017
comment
Спасибо Спасибо спасибо! Ты мой абсолютный герой для этого! Я бы тоже дал вам +1, но у меня еще недостаточно представителей, чтобы зарегистрировать его. - person Alexis; 14.11.2017