在Windows Phone应用程序中将位图更改为不同的形状

时间:2014-04-10 20:27:20

标签: windows-phone-8 bitmap nokia-imaging-sdk lumia-imaging-sdk

我一直在寻找解决方案已经有一段时间了,还没有找到它。我的应用程序的一个功能是加载图像然后改变它的形状 - 例如我加载一个普通的矩形图像,然后有2-3个按钮 - 将图像更改为圆形,三角形或其他形状。是这样甚至可能与Bitmaps?我发现诺基亚成像SDK有很多有趣的东西,但我找到的所有形状都是LensBlurEffect,这不是我需要的。

如果有人能指出我正确的方向,我将非常感激!

提前感谢您的帮助!

祝你好运, 罗马

2 个答案:

答案 0 :(得分:1)

位图始终是矩形的,你无能为力。

您可以做的是使一些像素透明,从而使位图看起来具有不同的形状。

使用诺基亚成像SDK执行此操作的一种方法是使用BlendFilter在原始图像上混合透明图像(我建议只使用ColorImageSource)。您可以提供不同的蒙版来创建不同的“形状”。

答案 1 :(得分:1)

我正在研究使用诺基亚成像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