Я загружаю свое использование структур
Texture2D.FromFile()
затем потяните их использование
spriteBatch.Draw()
Но вот точка: Я хочу изменить некоторые цвета изображения другому. Так мои вопросы:
Как изменить единственный цвет изображения к другому единственному цвету (например, синий к красному).
На самом деле то, что я действительно хочу сделать, изменяет группу цветов другой группе цветов. Например, красные и подобные оттенки к красному к синим и подобным оттенкам к синему. Можно сделать это, например, в Corel PHOTO-PAINT ("Цвет Замены").
Следует иметь в виду, что я - новичок в XNA. С наилучшими пожеланиями, Jack
Большое спасибо за справку, парней. Ответ Callum очень полезен действительно. Но я задаюсь вопросом, там встроенная функция для решения моей второй проблемы, потому что запись собственное может быть трудоемкой. И я думаю, такая функция может быть очень полезной. Что-то как:
color.SetNewColor(Color color_from, Color color_to, int range)
Такая функция, как я сказал прежде, создается в Corel PHOTO-PAINT. Для объяснения этого лучше вот, пример того, о чем я говорю:
Так, я только установил color_from, color_to и диапазон. Я думаю, что это работает как этот: это проверяет каждый цвет изображения, если это находится в диапазоне color_from, это изменяется на соответствующий цвет в оттенке color_to.
Я так понимаю, вы имеете в виду изменение отдельных пикселей? В этом случае используйте методы GetData ()
и SetData ()
класса Texture2D
.
Например, вы можете получить массив, содержащий цвета отдельных пикселей, выполнив следующие действия:
// 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;
}
где * дельта - допуск изменения для каждого цветового канала, который вы хотите принимать.
Чтобы ответить на ваше редактирование, нет встроенной функции, но вы можете просто использовать смесь идей из двух разделов выше:
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);
Решение Каллума является мощным и гибким.
Более ограниченное решение, которое немного проще реализовать, заключается в использовании параметра цвета spriteBatch.
Переменные
Texture2D sprite; //Assuming you have loaded this somewhere
Color color = Color.Red; //The color you want to use
Vector2 position = new Vector2(0f, 0f); //the position to draw the sprite
Код рисования
//Start the spriteBatch segment, enable alpha blending for transparency
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
//Draw our sprite at the specified position using a specified color
spriteBatch.Draw(sprite, position, color);
//end the spritebatch
spriteBatch.End();
Если ваш спрайт полностью белый, то использование этого метода сделает его красным. Также убедитесь, что вы используете формат файла с прозрачностью, PNG - самый любимый.
Каллум ударил его по голове, если вы меняете цвет 2D-изображений, как кажется, - но как вы можете видите, вам действительно нужно определить фактический пиксель, который вы хотите изменить, и отредактировать его, а не, например, «заменить желтый на зеленый».
Та же самая логика может быть использована для этой замены (просто прокрутите пиксели изображения и проверьте цвет - я могу сказать, что будьте осторожны при редактировании текстур, подобных этой, хотя они, казалось, вызывали довольно серьезные скачки производительности. в зависимости от того, что было сделано и как часто. Я не исследовал полностью, но думаю, что это вызывало довольно частую сборку мусора.