2014-02-13 25 views
1

我使用Windows 8 XAML-C++程序。 我显示图像是这样的:如何在本地修改纹理?

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

当用户触摸它,我想隐藏周围的触摸点的区域。我还需要知道整个图像何时被用户隐藏。我宁愿避免在大量的方块中切割我的图像。 用XNA(在Windows Phone应用程序我以前出版的),我使用的Texture2D显示的图像,而我使用的颜色[]变量的像素进行修改像素:

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?

回答

1

编辑2:

我看:)在这种情况下,我只想去纹理修改在运行时。您不需要DirectX,因为您可以使用GDI +在像素级别编辑图像。你可以使用触摸点的Color.a值确定“取消隐藏”操作中心像素,并采取了一堆像素的周围有一个设置为0

编辑:

因此,基于你的评论我认为你想要的是让用户通过点击他或她想要的位置来隐藏整个图像。

你提到你不想把图像剪成正方形。那么你可以做的是将图像区域分割成网格。不是字面意思,简单地计算网格的单元格如何放置在图像上方,如果它直接放置在图像的上面。

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

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

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

,你知道哪些看不见的细胞已经被感动了所有你需要做的就是直接绘制你的“隐藏”了质感这是一个方便的结构Rect :)

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

在我看来,这将是一个很大的运行速度更快,更简单比纹理切割机等

原来的答案来实现:

我觉得纹理修改方法是矫枉过正。它会为peprixel更新引入不必要的开销。

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

最终结果将与叠加纹理将覆盖/隐藏图像在触摸点完全相同。最好的部分是你不需要任何其他库来使这个工作。

+0

请问您能更精确一点吗?我不太明白你是如何“在接触点上塑造的”。 – Myosotis

+0

我的意思是说你可以为覆盖层的外观制作纹理,然而只需要在图像上方显示它。 – Alex

+0

好的,我明白了。但是,你怎么能让它在本地不透明呢? – Myosotis

0

,如果你希望做一个质地透明,你需要设置颜色为Color.Transparent

就我而言,我不得不做类似的事情,以你的情况 - 我有一个形象,我需要绘制一个边框在精灵之外,让原始精灵可见。我通过动态创建一个Texture2D对象,该对象具有原始精灵的相同宽度+2和相同高度+2(+2用于在原始精灵之外绘制边框,左边,右边,顶部和底部绘制一个像素)。将新的精灵颜色设置为Color.Transparent,然后绘制边框。

就你而言,它更简单一点。你用纯色动态地创建一个精灵,然后,每当用户触摸精灵时,将颜色设置为透明。

下面的代码将精灵设置为透明(我现在无法访问VS,因此代码可能有格式/语法问题)。如果你把这个代码放在一个函数中,你可以在透明和不透明之间动态地翻转它。编辑:我注意到你正在写C++,我的代码是在C#中,但我认为它会工作。

+0

这是我在XNA工作时所做的(请参阅我的问题中的代码)。但是当你不使用XNA时,你没有精灵,那么你如何将这个.pixelsTexture与图像联系起来呢? – Myosotis

+0

对不起,我误解了你的问题,因为你有XNA标签。我以为你在XNA工作:( – George