使用WriteableBitmapEx Windows Phone在较大的图像上叠加较小的图像

时间:2013-02-03 09:48:17

标签: c# windows-phone-8 blit writeablebitmapex

在我的隐藏对象游戏中,我想用以下代码标记带有圆形图像的对象,其中AnsX1,AnsX2,AnsY1,AnsY2是对象位置的像素坐标。应根据像素坐标

标记的对象大小调整圆形图像的大小
        imgCat.Source = writeableBmp;

        WriteableBitmap wbCircle = new WriteableBitmap(AnsX2 - AnsX1, AnsY2 - AnsY1);
        wbCircle = new WriteableBitmap(0, 0).FromContent("Images/circle.png");

        //Just to make sure the boundary is correct so I draw the green rec around the object
        writeableBmp.DrawRectangle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);

        Rect sourceRect = new Rect(0, 0, writeableBmp.PixelWidth, writeableBmp.PixelHeight);
        Rect destRect = new Rect(AnsX1, AnsY1, wbCircle.PixelWidth, wbCircle.PixelHeight);

        writeableBmp.Blit(destRect, wbCircle, sourceRect);
        writeableBmp.Invalidate();

我的问题是没有一个大圆圈,而是在顶部的矩形区域填充了几个较小的圆圈(见图):

enter image description here

编辑1: 基于@Rene响应,我已将代码更改为

        imgCat.Source = writeableBmp;

        //Just to make sure the boundary is correct so I draw the green rec around the object
        writeableBmp.DrawRectangle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);
        WriteableBitmap wbCircle = new WriteableBitmap(0, 0).FromContent("Images/circle.png");
        wbCircle = wbCircle.Resize(AnsX2 - AnsX1, AnsY2 - AnsY1, WriteableBitmapExtensions.Interpolation.Bilinear);

        Rect sourceRect = new Rect(0, 0, writeableBmp.PixelWidth, writeableBmp.PixelHeight);
        Rect destRect = new Rect(AnsX1, AnsY1, AnsX2 - AnsX1, AnsY2 - AnsY1);

        writeableBmp.Blit(destRect, wbCircle, sourceRect);
        writeableBmp.Invalidate();

这是结果

enter image description here

如果我设法解决这个问题,我将使用更大更好的质量circle.png。

1 个答案:

答案 0 :(得分:3)

首先我认为circle.png太小了。 Blit方法不能扩展。您需要首先使用Scale函数进行缩放,如下所示:

wbCircle = wbCircle.Resize(AnsX2 - AnsX1, AnsY2 - AnsY1, WriteableBitmapExtensions.Interpolation.Bilinear);

第二,sourceRect使用整个/目标位图的大小而不是wbCircle / source位图的大小。应该是:

sourceRect = new Rect(0, 0, wbCircle.PixelWidth, wbCircle.PixelHeight);

如果圆太小而且向上缩放太高,缩放可能会导致一些缩放伪像。如果你真的只需要一个简单的彩色圆圈,你也可以使用DrawCircle方法:

writeableBmp.DrawCircle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);