UWP — как использовать WriteableBimap в фоновой задаче? Альтернатива?

Следующий код считывает изображение и центрирует (вырезает и копирует) это изображение в результирующее изображение с черной рамкой и возвращает новое изображение.

Могу ли я сделать это без использования класса writeablebitmap?

private async Task<WriteableBitmap> FrameToCenter(StorageFile image, Size newSize)
    {
        WriteableBitmap result = new WriteableBitmap((int) newSize.Width,(int) newSize.Height);

        WriteableBitmap bitmapToFrame = await StorageFileToSoftwareBitmap(image);

        Rect sourceRect = new Rect(0, 0, bitmapToFrame.PixelWidth, bitmapToFrame.PixelHeight);
        int a = (int) Math.Min(newSize.Height, newSize.Width);
        Rect destRect = new Rect((int) ((_screenResolution.Width - _screenResolution.Height)/2), 0, a, a);

        result.Blit(destRect, bitmapToFrame, sourceRect);

        return result;
    }

Все работало нормально, но затем я попытался поместить этот код в BackgroundTask в UWP, что привело к исключению из-за того, что я не могу использовать WriteableBitmap в другом потоке, отличном от потока пользовательского интерфейса.

Есть ли что-нибудь еще, что я могу сделать? Однако мне нужно запустить его в фоновом режиме.

А также строчка:

result.Blit(destRect, bitmapToFrame, sourceRect);

на самом деле использует расширение WriteableBitmapEx, которое я не смогу использовать. Любым другим путем? Я действительно не вижу способа манипулировать растровым изображением в потоке фоновой задачи. Я тихо потерялся здесь. Я даже думал об использовании библиотеки openCV и просто сделал это на С++, решит ли это проблему?

Также есть эти SO Q&A, в которых упоминается, что я должен получить фоновую задачу из класс XamlRenderingBackgroundTask. Как я могу это сделать?


person pijemcolu    schedule 10.06.2016    source источник


Ответы (1)


Вы используете XamlBackgroundTask так же, как и обычную BackgroundTask.

public sealed class MyBackgroundTask : XamlRenderingBackgroundTask
{
    protected override async void OnRun(IBackgroundTaskInstance taskInstance)
    {
        var deferral = taskInstance.GetDeferral();
        //your code here
        deferral.Complete();
    }
 }

Разница в том, что у него будет доступ к потоку пользовательского интерфейса, поэтому вы можете использовать свой WriteableBitmap.

Я бы просто следил за важной рекомендацией в этой статье.

Важно. Чтобы фоновая задача занимала как можно меньше памяти, эту задачу следует реализовать в компоненте C++ среды выполнения Windows для Windows Phone. Объем памяти будет больше, если он написан на C#, и вызовет исключения из памяти на устройствах с малым объемом памяти, которые завершат фоновую задачу. Дополнительные сведения об ограничениях памяти см. в разделе Поддержка приложения с помощью фоновых задач.

person AlexDrenea    schedule 10.06.2016
comment
Как я могу наследовать, если моя задача является запечатанным классом? Я не понимаю. - person pijemcolu; 10.06.2016
comment
вы не наследуете от вашей задачи. Ваша задача наследуется от XamlBackgroundRenderingTask - person AlexDrenea; 10.06.2016