200分求渐变填充色 算法
发布网友
发布时间:2022-04-28 11:30
我来回答
共3个回答
热心网友
时间:2023-10-05 12:58
教你个利用双线性插值的方法,我是学VB的,C的不懂,代码就不能贴了,只能说下如何运算..剩下的就要靠你自己了
1.首先计算缩放比例..bl=2/w...2是原图宽度(因为只有2个颜色)...w是放大后的宽度
2.开始循环,从1循环到目标宽度w,假设循环变量为i...就用n=i*bl
3.取出n的小数部分存到变量p中..然后合成颜色,目标色R=R1*(1-p)+R2*p G=G1*(1-P)+G2*p B=B1*(1-P)+B2*p....R1/G1/B1是起始色的红/绿/蓝色,R2/G2/B2是结束色的红/绿/蓝色.
这个算法是什么原理呢,我说一下,算出的n=i*bl就是一个小数值.假如他是1.3,那么他靠1颜色就近些,所以1颜色对他的影响就大,所以R1*(1-p)+R2*p就体现了1颜色影响的范围大,2颜色影响小..假如是1.7,那么2颜色对他的影响大,1就小....所以他呈现渐变分布..
而双线性插值一般用语图像放大缩小..
热心网友
时间:2023-10-05 12:58
(1) RGB to YUV 或 HSV
(2) 线性内插YUV 或 HSV
(3) YUV 或 HSV to RGB
最好用HSV,但 RGB 到 HSV 和 HSV 到 RGB 的转换 难写一点,请自己写吧。
HSV(也叫HSB):
H:色相,范围0~360,每隔60度表示一种基本颜色(其他度数在是相邻的基本度数之间的颜色):红(RGB(255,0,0))->黄(RGB(255,255,0))->绿(RGB(0,255,0))->青(RGB(0,255,255))->蓝(RGB(0,0,255))->紫(RGB(255,0,255))->红
S:纯度(也翻译为色饱和度)。
V:亮度。
下面以YUV为例,首尾加内插点N = 10。
#include <stdio.h>
void RGBtoYUV(float R,float G,float B,float *Y, float *U, float *V)
{
*Y = 0.299*R + 0.587*G + 0.114*B;
*U = 0.492 * (B - *Y);
*V = 0.877 * (R - *Y);
}
void YUVtoRGB(float Y, float U, float V,float *R,float *G,float *B)
{
*R = Y + 1.140 * V;
*G = Y - 0.395 * U - 0.581 * V;
*B = Y + 2.032 * U;
if ( *R < 0.0) *R = 0.0;
if ( *G < 0.0) *G = 0.0;
if ( *B < 0.0) *B = 0.0;
}
void main()
{
float R1,B1,G1;
float R2,B2,G2;
float Y1,U1,V1;
float Y2,U2,V2;
int i,N=10;
float R[10],G[10],B[10];
float Y[10],U[10],V[10];
printf("Enter R1 B1 G1\n");
scanf("%f %f %f",&R1,&G1,&B1);
printf("Enter R2 B2 G2\n");
scanf("%f %f %f",&R2,&G2,&B2);
(void) RGBtoYUV(R1,G1,B1,&Y1, &U1, &V1);
(void) RGBtoYUV(R2,G2,B2,&Y2, &U2, &V2);
// (void) RGBtoHSV(R1,G1,B1,&Y1, &U1, &V1);
// (void) RGBtoHSV(R2,G2,B2,&Y2, &U2, &V2);
for (i=0;i<N;i++){
Y[i] = Y1 + (Y2-Y1)/ (N-1) * i;
U[i] = U1 + (U2-U1)/ (N-1) * i;
V[i] = V1 + (V2-V1)/ (N-1) * i;
(void) YUVtoRGB(Y[i], U[i], V[i],&R[i],&G[i],&B[i]);
// (void) HSVtoRGB(Y[i], U[i], V[i],&R[i],&G[i],&B[i]);
}
for (i=0;i<N;i++)printf("%.0f %.0f %.0f\n",R[i],G[i],B[i]);
}
热心网友
时间:2023-10-05 12:58
教你个利用双线性插值的方法,我是学VB的,C的不懂,代码就不能贴了,只能说下如何运算..剩下的就要靠你自己了
1.首先计算缩放比例..bl=2/w...2是原图宽度(因为只有2个颜色)...w是放大后的宽度
2.开始循环,从1循环到目标宽度w,假设循环变量为i...就用n=i*bl
3.取出n的小数部分存到变量p中..然后合成颜色,目标色R=R1*(1-p)+R2*p G=G1*(1-P)+G2*p B=B1*(1-P)+B2*p....R1/G1/B1是起始色的红/绿/蓝色,R2/G2/B2是结束色的红/绿/蓝色.
这个算法是什么原理呢,我说一下,算出的n=i*bl就是一个小数值.假如他是1.3,那么他靠1颜色就近些,所以1颜色对他的影响就大,所以R1*(1-p)+R2*p就体现了1颜色影响的范围大,2颜色影响小..假如是1.7,那么2颜色对他的影响大,1就小....所以他呈现渐变分布..
而双线性插值一般用语图像放大缩小..
热心网友
时间:2023-10-05 12:58
(1) RGB to YUV 或 HSV
(2) 线性内插YUV 或 HSV
(3) YUV 或 HSV to RGB
最好用HSV,但 RGB 到 HSV 和 HSV 到 RGB 的转换 难写一点,请自己写吧。
HSV(也叫HSB):
H:色相,范围0~360,每隔60度表示一种基本颜色(其他度数在是相邻的基本度数之间的颜色):红(RGB(255,0,0))->黄(RGB(255,255,0))->绿(RGB(0,255,0))->青(RGB(0,255,255))->蓝(RGB(0,0,255))->紫(RGB(255,0,255))->红
S:纯度(也翻译为色饱和度)。
V:亮度。
下面以YUV为例,首尾加内插点N = 10。
#include <stdio.h>
void RGBtoYUV(float R,float G,float B,float *Y, float *U, float *V)
{
*Y = 0.299*R + 0.587*G + 0.114*B;
*U = 0.492 * (B - *Y);
*V = 0.877 * (R - *Y);
}
void YUVtoRGB(float Y, float U, float V,float *R,float *G,float *B)
{
*R = Y + 1.140 * V;
*G = Y - 0.395 * U - 0.581 * V;
*B = Y + 2.032 * U;
if ( *R < 0.0) *R = 0.0;
if ( *G < 0.0) *G = 0.0;
if ( *B < 0.0) *B = 0.0;
}
void main()
{
float R1,B1,G1;
float R2,B2,G2;
float Y1,U1,V1;
float Y2,U2,V2;
int i,N=10;
float R[10],G[10],B[10];
float Y[10],U[10],V[10];
printf("Enter R1 B1 G1\n");
scanf("%f %f %f",&R1,&G1,&B1);
printf("Enter R2 B2 G2\n");
scanf("%f %f %f",&R2,&G2,&B2);
(void) RGBtoYUV(R1,G1,B1,&Y1, &U1, &V1);
(void) RGBtoYUV(R2,G2,B2,&Y2, &U2, &V2);
// (void) RGBtoHSV(R1,G1,B1,&Y1, &U1, &V1);
// (void) RGBtoHSV(R2,G2,B2,&Y2, &U2, &V2);
for (i=0;i<N;i++){
Y[i] = Y1 + (Y2-Y1)/ (N-1) * i;
U[i] = U1 + (U2-U1)/ (N-1) * i;
V[i] = V1 + (V2-V1)/ (N-1) * i;
(void) YUVtoRGB(Y[i], U[i], V[i],&R[i],&G[i],&B[i]);
// (void) HSVtoRGB(Y[i], U[i], V[i],&R[i],&G[i],&B[i]);
}
for (i=0;i<N;i++)printf("%.0f %.0f %.0f\n",R[i],G[i],B[i]);
}
热心网友
时间:2023-10-05 12:59
分别把起始色的R G B值加上结束色的R G B值 得出的合除2
这样不行啊 呵呵 那你把图片发大到500倍用 吸取工具吸取中间的颜色
这样可以吗
热心网友
时间:2023-10-05 12:59
分别把起始色的R G B值加上结束色的R G B值 得出的合除2
这样不行啊 呵呵 那你把图片发大到500倍用 吸取工具吸取中间的颜色
这样可以吗