c# - 如何在本地修改纹理?

标签 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:

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

编辑:

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

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

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

既然我们有了网格,计算出每个单元格的范围就相对简单了。您只需使用一组 Rect 结构来表示您的网格单元。

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

现在你知道哪个不可见的单元格被触摸了,你所要做的就是直接在单元格上绘制你的“隐藏”纹理,它很方便地是一个 Rect 结构 :)

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

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

原始答案:

我认为纹理修改方法有点矫枉过正。它将为 peprixel 更新引入不必要的开销。

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

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

关于c# - 如何在本地修改纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21749292/

相关文章:

c# - 将非托管/非托管成员添加到托管类

c# - AccessibleObjectFromPoint 返回客户端对象而不是复选框

c++ - Qt5 : Strange compilation error while using QCommandLineParser class

c++ Directx11捕获屏幕并保存到文件

java - LibGDX:Android 设备上加载纹理缓慢(不断调用垃圾收集器)

c# - 无法将文件从 Angular 8 上传到 Asp.net Core 2.2

c# - Entity Framework 中异步方法的正确使用

c++ - 在 std::array 类型 C++ 中访问值的问题

c++ - IFileOperation 在哪里实现(以及如何验证这一点)?

c# - 如何检查 Texture2D 是否透明?