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

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

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

Моя проблема в том, что я сейчас работаю над двумя разными приложениями. Первое - это приложение UWP для доставки пакетов для внутренней почтовой системы. Идея заключается в том, что после получения пакета человек подпишет приложение, используя подпись InkCanvas. Затем он должен быть сохранен в базе данных в виде байтового массива, а затем перезагружен в приложении WinForm или WebForm (сейчас я делаю WinForm сначала) в виде обычного старого файла образа. Тем не менее, я абсолютно застрял при преобразовании между WriteableBitmap, который я получаю из UWP, и обычным растровым изображением, которое мне нужно загрузить в 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... поэтому я здесь совершаю ошибку? Я читаю подпись в неправильном формате? Или мне нужно сделать что-то еще, чтобы преобразовать форматы из одного в другой?

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

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

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();
}
Другие вопросы по тегам