Измените растровое изображение на различные формы в приложении Windows Phone

Я давно искал решение и пока не нашел его. Одна из функций моего приложения - загрузить изображение, а затем изменить его форму - например, я загружаю обычное прямоугольное изображение, а затем есть 2-3 кнопки - изменить изображение на круг, треугольник или какую-либо другую форму. Возможно ли что-нибудь подобное с растровыми изображениями? Я нашел много интересного о Nokia Imaging SDK, но все, что я нашел, это LensBlurEffect, что не совсем то, что мне нужно.

Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен!

Заранее благодарю за помощь!

С наилучшими пожеланиями, Роман

2 ответа

Решение

Я работаю над фильтрами, которые рисуют фигуры с помощью Nokia Imaging SDK. Чтобы решить вашу проблему, я создал пример проекта, который использует смешанный фильтр Nokia Imaging SDK и мои собственные фильтры формы.

На самом деле вы можете сделать то же самое с изображением фигуры, на которое ссылается Дэвид (фон черный, белый на переднем плане) вместо использования моих пользовательских фильтров (EllipseShapeFilter над примером кода).

Вот пример кода;

var ellipseImage = new WriteableBitmap(1024, 768);
Rect origin = new Rect(new Point(512, 384), new Size(512, 384));
uint white = 0xff000000 | (255 << 16) | (255 << 8) | 255;

var image = LoadFromResources(new Uri(@"/BlendImageSample;component/Assets/Sample.jpg", UriKind.Relative));

using (var ellipseSource = new BitmapImageSource(ellipseImage.AsBitmap()))
using (var ellipse = new EllipseShapeFilter(ellipseSource, white, origin))
{
    ellipseImage = await new WriteableBitmapRenderer(ellipse, ellipseImage).RenderAsync();
}

ImageViewer.Source = ellipseImage;

using (var backgroundSource = new BitmapImageSource(ellipseImage.AsBitmap()))
using (var foregroundSource = new BitmapImageSource(image.AsBitmap()))
using (var filterEffect = new FilterEffect(backgroundSource))
{
    using (BlendFilter blendFilter = new BlendFilter())
    {
        blendFilter.ForegroundSource = foregroundSource;
        blendFilter.BlendFunction = BlendFunction.Darken;

        filterEffect.Filters = new[] { blendFilter };

        var OutputBitmap = new WriteableBitmap(image.PixelWidth, image.PixelHeight);
        var result = await new WriteableBitmapRenderer(filterEffect, OutputBitmap).RenderAsync();

        ImageViewer.Source = result;
    }
}

Github - BlendImageSample

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

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

Одним из способов сделать это с помощью Nokia Imaging SDK является использование BlendFilter для наложения прозрачного изображения (я предлагаю только ColorImageSource) на исходное изображение. Вы можете предоставить разные маски для создания разных "фигур".

Другие вопросы по тегам