如何实现photoshop 色相调节功能

cnblue春春 2018-04-21 11:05:00
如何在rgb模式下实现,photoshop中色相(hue)调节的计算?
...全文
1041 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2018-04-24
  • 打赏
  • 举报
回复
我刚才在photoshop中看了一下,调H时,RGB的最大值和最小值不变,只调中间的值 ,以H调大为例,如果下面的值是最大值,那么就往小调,调到最小时,把下一个往上调,每个颜色调60度,均分,以此类推。这样效率应该高一些,适用于是大量数据。
schlafenhamster 2018-04-24
  • 打赏
  • 举报
回复
"Adobe RGB和sRGB色彩空间的主要区别" https://blog.csdn.net/self_mind/article/details/50801140
赵4老师 2018-04-23
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
rgb 相同 也 不一定 ‘颜色’ 相同
你是说红外线、紫外线、γ射线、……的‘颜色’吗?
schlafenhamster 2018-04-23
  • 打赏
  • 举报
回复
http://www.doc88.com/p-9973777316277.html “色彩管理第二章色彩概论”
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复
rgb 相同 也 不一定 ‘颜色’ 相同
cnblue春春 2018-04-22
  • 打赏
  • 举报
回复
只能通过转化为hsl计算吗?例如饱和度、明度等就可以直接在rgb模式下计算(https://blog.csdn.net/xingyanxiao/article/details/48035537),色相调节有类似的原理吗?在rgb和hsl之间来回转换效率太低了。
schlafenhamster 2018-04-22
  • 打赏
  • 举报
回复

//
void HSL2RGB(int hue,double saturation, double lightness,BYTE &red,BYTE &green,BYTE &blue)
{
	if(saturation==0)
	{
		red=green=blue=(BYTE)(lightness*255);
	}
	else
	{
		double m1,m2;
		if(lightness <= 0.5)
			m2=lightness + lightness*saturation;
		else
			m2=lightness + saturation -lightness*saturation;
//
		m1   = 2*lightness-m2;
		red  = ByteValue(m1,m2,hue+120);
		green= ByteValue(m1,m2,hue);
		blue = ByteValue(m1,m2,hue-120);
	}
}
typedef enum {Red, Green, Blue};

BOOL RGB2HLS(BYTE red,BYTE green,BYTE blue,int &hue,double &saturation, double &lightness)
{
	double mn,mx;
	int major;
	if(red < green)
	{
		mn=red;mx=green;major=Green;
	}
	else
	{
		mn=green;mx=red;major=Red;
	}
//
	if(blue < mn)
	{
		mn=blue;
	}
	else if (blue > mx)
	{
		mx=blue;major=Blue;
	}
//
	if(mn==mx)
	{
		lightness=mn/255;
		saturation=0;
		hue=240;// ?? 0;
	}
	else
	{
		lightness=(mn+mx)/510; // 2*255
		if(lightness <= 0.5) saturation=(double)(mx-mn)/(double)(mn+mx);
		else				 saturation=(double)(mx-mn)/(double)(510-mn-mx);
		switch(major)
		{
		case Red:
			hue=(int)((green-blue)*60/(mx-mn)+360);
			break;
		case Green:
			hue=(int)((blue-red)*60/(mx-mn)+120);
			break;
		case Blue:
			hue=(int)((red-green)*60/(mx-mn)+240);
			break;
		}
		if(hue >= 360) hue -= 360;
	}
	if(mn==0 && mx==255) return TRUE;
	else                 return FALSE;
}
//
BYTE ByteValue(double m1, double m2, double hue)
{
	if( hue>360 )    hue -= 360;
	else if( hue<0 ) hue += 360;
//
	if     ( hue<60 )	m1=m1+(m2-m1)*hue/60;
	else if( hue<180 )  m1=m2;
	else if( hue<240 )  m1=m1+(m2-m1)*(240-hue)/60;
//
	return (BYTE)(m1*255);
}

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧