2013-07-31 5 views
0

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

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.

EDIT: Поменять местами я имею в виду, что Color1 переведет на color2, а color2 переведет на color1. Похоже, мне нужна трансформация отражения. Как рассчитать это?

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

+0

Вы можете посмотреть на исходный код вкладной? Это может быть большой проблемой для вашего ответа, но он доступен: http: //www.gimp.org/downloads/# mirror – Stepan1010

+1

Использование матрицы замены цвета для обмена значениями внутри цвета, а не для замены двух отдельных цветов ... –

ответ

0

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

  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

1

Это, как представляется, раздел файла 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 

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

Вы могли бы изменили его от красного до зеленого, как так:

-1 1 0 0 1 

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

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

Удачи.

+0

Я ценю вашу помощь, я просто смотрел на тот же код. Похоже, что это не делается с помощью цветовой матрицы, и это то, что мне нужно. –

+0

@Vt Это та же концепция. См. Мое редактирование. – Stepan1010

+0

@Vt Кажется, что цветные матрицы используются для более сложных операций, чем просто замена цветов. (например, вращающиеся цвета, масштабирование цветов и т. д.). Вот для чего нужна вся эта дополнительная информация о матрице. Но что касается того, что вы пытаетесь сделать, вам нужно только беспокоиться о нижнем ряду (при условии, что стандартные четыре строки в моем примере и стандартный 5-й столбец). – Stepan1010

Смежные вопросы