Поменяйте местами два цвета, используя цветовую матрицу

Как я могу поменять два цвета, используя цветовую матрицу? Например, поменять местами красный и синий цвета очень просто. Матрица будет выглядеть так:

0 0 1 0 0
0 1 0 0 0
1 0 0 0 0
0 0 0 1 0
0 0 0 0 1

Так как я могу поменять любые два цвета в целом? Например, есть Color1 с R1, G1, B1 и Color2 с R2, G2, B2.

РЕДАКТИРОВАТЬ: под свопом я подразумеваю, что Color1 будет переводиться в color2, а color2 будет переводиться в color1. Похоже, мне нужно преобразование отражения. Как рассчитать это?

Ссылка на GIMP удалена. Извините за недопонимание.

0

Решение

Похоже, это раздел файла color-exchange.c в источнике GIMP, который циклически перебирает все пиксели и, если пиксель соответствует выбранным критериям (который может быть диапазоном цветов), заменяет его на выбранный цвет:

  for (y = y1; y < y2; y++)
{
gimp_pixel_rgn_get_row (&srcPR, src_row, x1, y, width);

for (x = 0; x < width; x++)
{
guchar pixel_red, pixel_green, pixel_blue;
guchar new_red, new_green, new_blue;
guint  idx;

/* get current pixel-values */
pixel_red   = src_row[x * bpp];
pixel_green = src_row[x * bpp + 1];
pixel_blue  = src_row[x * bpp + 2];

idx = x * bpp;

/* want this pixel? */
if (pixel_red >= min_red &&
pixel_red <= max_red &&
pixel_green >= min_green &&
pixel_green <= max_green &&
pixel_blue >= min_blue &&
pixel_blue <= max_blue)
{
guchar red_delta, green_delta, blue_delta;

red_delta   = pixel_red > from_red ?
pixel_red - from_red : from_red - pixel_red;
green_delta = pixel_green > from_green ?
pixel_green - from_green : from_green - pixel_green;
blue_delta  = pixel_blue > from_blue ?
pixel_blue - from_blue : from_blue - pixel_blue;

new_red   = CLAMP (to_red   + red_delta,   0, 255);
new_green = CLAMP (to_green + green_delta, 0, 255);
new_blue  = CLAMP (to_blue  + blue_delta,  0, 255);
}
else
{
new_red   = pixel_red;
new_green = pixel_green;
new_blue  = pixel_blue;
}

/* fill buffer */
dest_row[idx + 0] = new_red;
dest_row[idx + 1] = new_green;
dest_row[idx + 2] = new_blue;

/* copy alpha-channel */
if (has_alpha)
dest_row[idx + 3] = src_row[x * bpp + 3];
}
/* store the dest */
gimp_pixel_rgn_set_row (&destPR, dest_row, x1, y, width);

/* and tell the user what we're doing */
if (!preview && (y % 10) == 0)
gimp_progress_update ((gdouble) y / (gdouble) height);
}

GIMP_Image

EDIT / ПРИСОЕДИНЕНИЕ

Другой способ, которым вы могли бы преобразовать красный в синий, был бы с этой матрицей:

1   0   0   0   0
0   1   0   0   0
0   0   1   0   0
0   0   0   1   0
-1  0   1   0   1

Единственные значения, которые действительно имеют значение, — это нижние значения в этой матрице.

Это было бы то же самое, что сказать вычесть 255 из красного, оставить зеленый цвет таким же, а затем добавить 255 к синему. Вы можете разрезать альфу пополам примерно так:

-1  0   1   -0.5    1

Поэтому (как и в случае с gimp-источником) вам просто нужно найти разницу между вашим текущим цветом и вашим целевым цветом для каждого канала, а затем применить разницу. Вместо значений канала от 0 до 255 вы должны использовать значения от 0 до 1.

Вы могли бы изменить его с красного на зеленый следующим образом:

-1  1   0   0   1

Смотрите здесь для некоторой хорошей информации:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms533875%28v=vs.85%29.aspx

Удачи.

1

Другие решения

Я решил это путем создания матрицы отражения через D3DXMatrixReflect используя плоскость, которая перпендикулярна вектору AB и пересекает среднюю точку AB.

  1. D3DXVECTOR3 AB( colorA.r-colorB.r, colorA.g-colorB.g, colorA.b-colorB.b );

  2. D3DXPLANE plane( AB.x, AB.y, AB.z, -AB.x*midpoint.x-AB.y*midpoint.y-AB.z*midpoint.z );

  3. D3DXMatrixReflect

0

По вопросам рекламы [email protected]