gpt4 book ai didi

c# - XNA C# 中的颜色替换

转载 作者:太空狗 更新时间:2023-10-29 19:53:21 26 4
gpt4 key购买 nike

我加载我的纹理使用

Texture2D.FromFile()

然后使用

绘制它们
spriteBatch.Draw()

但重点是:我想将图像的某些颜色更改为另一种颜色。所以我的问题:

  1. 如何将图像的单一颜色更改为另一种单一颜色(例如,蓝色到红色)。

  2. 事实上,我真正想做的是将一组颜色更改为另一组颜色。例如红色和与红色相似的色调到蓝色以及与蓝色相似的色调。例如,您可以在 Corel PHOTO-PAINT(“替换颜色”)中执行此操作。

请记住,我是 XNA 的初学者。最好的祝福, jack

编辑:

非常感谢你们的帮助,伙计们。卡勒姆的回答确实很有帮助。但是我想知道是否有内置函数可以解决我的第二个问题,因为自己编写可能很耗时。而且我认为,这种功能可能非常有用。像这样的东西:

color.SetNewColor(Color color_from, Color color_to, int range)

正如我之前所说,这种功能内置于 Corel PHOTO-PAINT 中。为了更好地解释它,这里是我正在谈论的例子:

link text

因此,我只设置了 color_from、color_to 和 range。我认为它是这样工作的:它检查图像的每种颜色,如果它在 color_from 的范围内,则将其更改为颜色为 color_to 的适当颜色。

最佳答案

我假设您的意思是更改单个像素?在这种情况下,请使用 Texture2D 类的 GetData()SetData() 方法。


例如,您可以通过执行以下操作获得包含各个像素颜色的数组:

// Assume you have a Texture2D called texture

Color[] data = new Color[texture.Width * texture.Height];
texutre.GetData(data);

// You now have a packed array of Colors.
// So, change the 3rd pixel from the right which is the 4th pixel from the top do:

data[4*texture.Width+3] = Color.Red;

// Once you have finished changing data, set it back to the texture:

texture.SetData(data);

请注意,您可以使用 GetData() 的其他重载来仅选择一个部分。


因此,要将指定颜色的每个像素替换为另一种颜色:

// Assume you have a Texture2D called texture, Colors called colorFrom, colorTo

Color[] data = new Color[texture.Width * texture.Height];
texutre.GetData(data);

for(int i = 0; i < data.Length; i++)
if(data[i] == colorFrom)
data[i] = colorTo;

texture.SetData(data);

要查看色调是否相似,试试这个方法:

private bool IsSimilar(Color original, Color test, int redDelta, int blueDelta, int greenDelta)
{
return Math.Abs(original.R - test.R) < redDelta && Math.Abs(original.G - test.G) < greenDelta && Math.Abs(original.B - test.B) < blueDelta;
}

其中 *delta 是您要接受的每个颜色 channel 的变化容差。


要回答您的编辑,没有内置函数,但您可以混合使用上述两部分的想法:

Color[] data = new Color[texture.Width * texture.Height];
texutre.GetData(data);

for(int i = 0; i < data.Length; i++)
if(IsSimilar(data[i], colorFrom, range, range, range))
data[i] = colorTo;

texture.SetData(data);

关于c# - XNA C# 中的颜色替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com