如何在本地修改纹理?

时间:2014-02-13 08:56:28

标签: c# c++ texture2d

我在Windows 8 XAML-C ++程序上工作。 我显示这样的图像:

<Grid>
    <Image Source="myImage.png"/>
</Grid>

当用户触摸它时,我想隐藏触摸点周围的区域。我还需要知道用户何时以这种方式隐藏整个图像。我宁愿避免在大量正方形中切割我的图像。 使用XNA(我之前发布的Windows Phone应用程序),我使用Texture2D显示图像,并使用Color []变量逐个像素地修改它:

Color[] pixelsTexture;
(...)
this.pixelsTexture[i] = newColor;
(...)
Texture2D tex = new Texture2D(GraphicDevice, this.texture.Width, this.texture.Height);
tex.SetData(this.pixelsTexture);
this.texture = tex;

但在这里,我需要的是使图像透明,以便用户逐步显示下面的图像。 我有一个简单的方法(我的意思是:不使用DirectX的东西)在不使用XNA的情况下修改图像?

2 个答案:

答案 0 :(得分:1)

编辑2:

我明白了:)在这种情况下,我只是在运行时进行纹理修改。您不需要DirectX,因为您可以使用GDI +在像素级别编辑图像。您可以使用触摸点来识别“隐藏”操作的中心像素,并在其周围拍摄一堆像素,将Color.a值设置为0。

编辑:

因此,根据您的评论,我认为您想要的是让用户通过点击他或她想要的任何地方来隐藏整个图像。

您提到您不希望将图像剪切成方块。那么你可以做的是将图像区域分割成网格。不是字面意思,只是简单地计算如果网格的单元直接放在它上面,它将如何定位在图像上。

例如,256 x 256图像可以被32 x 32个不可见单元格的网格覆盖。这给了我们一个8 x 8网格。

现在我们有了一个网格,找出每个单元格的范围相对简单。您只需使用Rect结构数组来表示网格单元格。

当用户触摸图像时,您可以使用触摸位置通过比较触摸点与每个网格单元格的左上角和右下角点来确定触摸了哪个网格单元格。你这样做,直到你得到一个左上角点'较小'且右下角点比你的触摸点“大”的单元格。

既然您知道触摸了哪个不可见的单元格,那么您需要做的就是直接在单元格上绘制“隐藏”纹理,方便的是Rect结构:)

就这么简单。最终的结果就像你将纹理切割成一堆瓷砖一样。

在我看来,这将在运行时更快,并且比纹理切割器等更容易实现。

原始答案:

我认为纹理修改方法过度。它将为peprixel更新带来不必要的开销。

就个人而言,我会在触摸点覆盖所需大小和形状的纹理。纹理可以是半透明或不透明的,您可以选择。

最终结果与覆盖纹理在触摸点覆盖/隐藏图像完全相同。最好的部分是你不需要任何其他库来实现这一点。

答案 1 :(得分:0)

如果您想使纹理透明,则需要将颜色设置为Color.Transparent

在我的情况下,我必须做一些类似于你的情况 - 我有一个图像,我需要在精灵外面画一个边框,让原始的精灵可见。我通过动态创建一个Texture2D对象来实现这一目标,该对象具有相同的宽度+ 2和相同的高度+ 2的原始精灵(+2用于绘制原始精灵外部的边框,左边一个像素,右边, 顶部和底部)。将新的精灵颜色设置为Color.Transparent,然后绘制边框。

在你的情况下,它有点简单。你动态创建一个纯色的精灵,然后,当用户触摸精灵时,将颜色设置为透明。

下面的代码将精灵设置为透明(我现在无权访问VS,因此代码可能存在格式/语法问题)。如果将此代码放在函数中,则可以在透明和非透明之间动态地翻转它。

for (int i=0; i<this.pixelsTexture.Count; i++)
{
    this.pixelsTexture[i] = Color.Transparent;
}
tex.SetData(this.pixelsTexture);
编辑:我注意到你是用C ++编写的,我的代码是在C#中,但我认为它会起作用。