如何使用颜色矩阵交换两种颜色?例如,交换红色和蓝色很容易。矩阵看起来像:
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
那么我一般如何交换任何两种颜色呢?例如,有 R1、G1、B1 的 Color1 和 R2、G2、B2 的 Color2。
编辑:通过交换,我的意思是 Color1 将转换为 color2,而 color2 将转换为 color1。看起来我需要一个反射转换。如何计算它?
GIMP 参考已删除。很抱歉造成混乱。
如何使用颜色矩阵交换两种颜色?例如,交换红色和蓝色很容易。矩阵看起来像:
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
那么我一般如何交换任何两种颜色呢?例如,有 R1、G1、B1 的 Color1 和 R2、G2、B2 的 Color2。
编辑:通过交换,我的意思是 Color1 将转换为 color2,而 color2 将转换为 color1。看起来我需要一个反射转换。如何计算它?
GIMP 参考已删除。很抱歉造成混乱。
这似乎是 GIMP 源中 color-exchange.c 文件中循环遍历所有像素的部分,如果像素符合所选标准(可以是颜色范围),则将其与所选颜色交换:
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);
}
编辑/添加
您可以将红色转换为蓝色的另一种方法是使用此矩阵:
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 加到蓝色中是一样的。你可以像这样将 alpha 减半:
-1 0 1 -0.5 1
所以(就像 gimp 源一样)你只需要为每个通道找到当前颜色和目标颜色之间的差异,然后应用差异。您可以使用 0 到 1 的值,而不是 0 到 255 的通道值。
您可以将其从红色更改为绿色,如下所示:
-1 1 0 0 1
请参阅此处以获取一些有用的信息:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms533875%28v=vs.85%29.aspx
祝你好运。
D3DXMatrixReflect
我通过使用垂直于矢量 AB 并与 AB 的中点相交的平面创建反射矩阵来解决它。
D3DXVECTOR3 AB( colorA.r-colorB.r, colorA.g-colorB.g, colorA.b-colorB.b );
D3DXPLANE plane( AB.x, AB.y, AB.z, -AB.x*midpoint.x-AB.y*midpoint.y-AB.z*midpoint.z );
D3DXMatrixReflect