Цветная замена в XNA C#

Я загружаю свое использование структур

Texture2D.FromFile()

затем потяните их использование

spriteBatch.Draw()

Но вот точка: Я хочу изменить некоторые цвета изображения другому. Так мои вопросы:

  1. Как изменить единственный цвет изображения к другому единственному цвету (например, синий к красному).

  2. На самом деле то, что я действительно хочу сделать, изменяет группу цветов другой группе цветов. Например, красные и подобные оттенки к красному к синим и подобным оттенкам к синему. Можно сделать это, например, в 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.

7
задан Jack 16 July 2010 в 13:59
поделиться

3 ответа

Я так понимаю, вы имеете в виду изменение отдельных пикселей? В этом случае используйте методы 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);
11
ответ дан 6 December 2019 в 08:41
поделиться

Решение Каллума является мощным и гибким.

Более ограниченное решение, которое немного проще реализовать, заключается в использовании параметра цвета 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 - самый любимый.

3
ответ дан 6 December 2019 в 08:41
поделиться

Каллум ударил его по голове, если вы меняете цвет 2D-изображений, как кажется, - но как вы можете видите, вам действительно нужно определить фактический пиксель, который вы хотите изменить, и отредактировать его, а не, например, «заменить желтый на зеленый».

Та же самая логика может быть использована для этой замены (просто прокрутите пиксели изображения и проверьте цвет - я могу сказать, что будьте осторожны при редактировании текстур, подобных этой, хотя они, казалось, вызывали довольно серьезные скачки производительности. в зависимости от того, что было сделано и как часто. Я не исследовал полностью, но думаю, что это вызывало довольно частую сборку мусора.

2
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: