




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络多媒体技术(双语)课程报告题目: 色彩空间的转换 姓名: 刘小艳 学号: 081006315 日期: 2010年10月26日 色彩空间的转换色彩空间,也称作色彩模型,是数学化描述色彩的基础。我们经常用到的色彩空间主要有RGB颜色空间,CMY/CMYK颜色空间,HSV/HSB颜色空间,CIE系列颜色空间等等。由于不同色彩空间的属性存在很大差别,因而应用方向也会有所不同。在很多情况下需要在不同的色彩模型之间进行转换。在此介绍下RGB和HSV之间的互转方法。一、 将RGB转换到HSV的方法先将R,G,B归一化,R,G,B0,1,且将变换后的H的取值范围设为003600 ,S,V0,1,则RGB到HSV的变换公式为: 其中 二、 将HSV转换到RGB的方法同样,将R,G,B归一化,R,G,B0,1,且将变换后的H的取值范围设为003600 ,S,V0,1,则HSV到RGB的变换公式为:if S=0,then R=G=B=Vif S0,then 其中 其中 依据上述原理,制作出能实现R,G,B三色与H,S,V三色相互转换的功能的调色板。实现的具体过程:一、创建一个基于对话框的MFC应用程序“Color”。二、依照图示在对话框中添加控件,将对话框名改为ColorPicker 对控件的属性及关联变量进行设置(按从左到右,从上到下的顺序):1、三个图片控件从左到右,从上到下依次为:资源ID关联变量类型关联变量名称IDC_COLOR_AREACStaticm_ColorAreaIDC_COLOR_BANDCStaticm_ColorBandIDC_COLOR_PREVCStaticm_ColorPrev2、四个滑块控件:资源ID关联变量类型关联变量名称IDC_SLIDER_COLORCSliderCtrlm_SliderColorIDC_SLIDER_REDintm_nSliderRedIDC_SLIDER_GREENintm_nSliderGreenIDC_SLIDER_BLUEintm_nSliderBlue 3、六个文本框控件:资源ID关联变量类型关联变量名称IDC_EDIT_REDintm_nRedIDC_EDIT_GREENintm_nGreenIDC_EDIT_BLUEintm_nBlueIDC_EDIT_Hintm_nHIDC_EDIT_Sintm_nSIDC_EDIT_Vintm_nV三、具体代码的实现 1、ColorDlg.h的代码中添加公有函数void DrawColorBand(void);/ 绘制颜色框void UpDateColorArea(void);/ 更新颜色面板的颜色void UpdateRGB(void);/ 将HSV转换为RGB,并更新对应数据void UpdateHSV(void);/ 将RGB转换为HSV,并更新对应数据void UpdatePrev(void);/ 更新颜色预览框void OnSliderColorChange(void);/ 滑块滑动的消息响应函数virtual BOOL PreTranslateMessage(MSG* pMsg);/ 屏幕取色处理函数/消息响应函数afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);/ 滑块滑动的消息响应函数/ 滑块滑动的消息响应函数afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/ 按下鼠标左键的响应函数/ 按下鼠标左键的响应函数/ 按下鼠标左键的响应函数afx_msg void OnEnChangeEditRed();/ 红色文本框内容改变的响应函数afx_msg void OnEnChangeEditGreen();/ 绿色文本框内容改变的响应函数afx_msg void OnEnChangeEditBlue();/ 蓝色文本框内容改变的响应函数afx_msg void OnEnChangeEditH();/ H文本框内容改变的响应函数afx_msg void OnEnChangeEditS();/ S文本框内容改变的响应函数afx_msg void OnEnChangeEditV();/ V文本框内容改变的响应函数:2、ColorDlg.cpp中的添加代码:在BOOL CColorDlg:OnInitDialog()中添加:/ 改变窗口大小m_ColorArea.SetWindowPos(NULL, 0, 0, 256, 256, SWP_NOMOVE);m_ColorBand.SetWindowPos(NULL, 0, 0, 256, 40, SWP_NOMOVE);m_SliderColor.SetWindowPos(NULL, 0, 0, 268, 20, SWP_NOMOVE);/ 设置滑块取值范围m_SliderColor.SetRange(0, 1535);(CSliderCtrl*)GetDlgItem(IDC_SLIDER_RED)-SetRange(0, 255);(CSliderCtrl*)GetDlgItem(IDC_SLIDER_GREEN)-SetRange(0, 255);(CSliderCtrl*)GetDlgItem(IDC_SLIDER_BLUE)-SetRange(0, 255);在void CColorDlg:OnPaint()中添加:DrawColorBand();/ 绘制颜色框UpDateColorArea();/ 更新颜色面板的颜色添加公有函数的具体函数实现:/*作用:绘制颜色框*/void CColorDlg:DrawColorBand(void)/ 获取颜色框CDCCDC* pDC = m_ColorBand.GetDC();CPen* oldPen = NULL;int i;int k = 0;for (i = 0; i SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);for (i = 252; i = 0; i -= 6)CPen pen(PS_SOLID, 1, RGB(i, 0, 255);pDC-SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);k+;for (i = 6;i SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);k+;for (i = 252; i = 0; i -= 6)CPen pen(PS_SOLID, 1, RGB(0, 255, i);pDC-SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);k+;for (i = 6; i SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);k+;for (i = 252; i = 0; i -= 6)CPen pen(PS_SOLID, 1, RGB(255, i, 0);pDC-SelectObject(&pen);pDC-MoveTo(k, 0);pDC-LineTo(k, 40);k+;pDC-SelectObject(oldPen);/*作用:更新颜色面板的颜色*备注:以红,绿,蓝当前的取值为依据,更新面板*/void CColorDlg:UpDateColorArea(void)UpdateData(TRUE);CDC*pDC = m_ColorArea.GetDC();/ 颜色面板的CDCCDCmemDC;/ 内存CDCCBitmap bitmap;/ 内存位图BITMAPinfoBitmap;/ 位图信息结构体/ 创建内存CDCmemDC.CreateCompatibleDC(pDC);/ 创建设备相关位图bitmap.CreateCompatibleBitmap(pDC, 256, 256);/ 获得位图信息bitmap.GetBitmap(&infoBitmap);/ 是否支持32位颜色if (infoBitmap.bmBitsPixel != 32)MessageBox(当前显示设备不支持32位颜色,程序自动退出!);PostMessage(WM_QUIT);BYTE* pixels = new BYTE256 * 256 * 4;/ 32位颜色点阵数组int rForRow, gForRow, bForRow, rForColumn, gForColumn, bForColumn;for(int y = 0; y 256; y+)rForRow = m_nRed - (m_nRed * y / 255);gForRow = m_nGreen - (m_nGreen * y / 255);bForRow = m_nBlue - (m_nBlue * y / 255);for(int x = 0; x BitBlt(0, 0, 256, 256, &memDC, 0, 0, SRCCOPY);ReleaseDC(pDC);#define SAFE_DELETE_ARRAY(p)delete(p);(p)=NULL;SAFE_DELETE_ARRAY (pixels);/ 更新颜色预览框UpdatePrev();/*作用:将RGB转换为HSV,并更新对应数据*/void CColorDlg:UpdateHSV(void)UpdateData(TRUE);float R = m_nRed / 255.0f;float G = m_nGreen / 255.0f;float B = m_nBlue / 255.0f;float H = 0.0f;float S = 0.0f;float V = 0.0f;float RGBmax = max( max( R ,G ),B ) ;float RGBmin = min( min( R ,G ),B ) ;V = RGBmax * 100;if(RGBmax != RGBmin)S = (float)(RGBmax - RGBmin) / RGBmax) * 100;if (R = RGBmax)H = (G - B) / (RGBmax - RGBmin);if (G = RGBmax)H = 2 + (B - R) / (RGBmax - RGBmin);if (B = RGBmax)H = 4 + (R - G) / (RGBmax - RGBmin);H = H * 60;if (H FillRect(rect, &brush); / 利用当前RGB颜色填充颜色预览框ReleaseDC(pDC); / 释放CDC指针/*作用:滑块滑动的消息响应函数*备注:对话框面板中所有滑块滑动都由该函数处理*/void CColorDlg:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)UpdateData(TRUE);if ( (&m_SliderColor) = (CSliderCtrl*)pScrollBar )OnSliderColorChange();else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_RED) = (CSliderCtrl*)pScrollBar )m_nRed = m_nSliderRed;else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_GREEN) = (CSliderCtrl*)pScrollBar )m_nGreen = m_nSliderGreen;else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_BLUE) = (CSliderCtrl*)pScrollBar )m_nBlue = m_nSliderBlue;UpdateData(FALSE);/ 滑块改动的是RGB值,要重新更新HSV值UpdateHSV();UpDateColorArea();CDialog:OnHScroll(nSBCode, nPos, pScrollBar);/*作用:主滑块滑动处理函数*/void CColorDlg:OnSliderColorChange(void)switch(m_SliderColor.GetPos() / 256)case 0:m_nRed = m_nSliderRed = 255;m_nGreen = m_nSliderGreen = 0;m_nBlue = m_nSliderBlue = m_SliderColor.GetPos();break;case 1:m_nRed = m_nSliderRed = 255 -(m_SliderColor.GetPos() - 256);m_nGreen = m_nSliderGreen = 0;m_nBlue = m_nSliderBlue = 255;break;case 2:m_nRed = m_nSliderRed = 0;m_nGreen = m_nSliderGreen = m_SliderColor.GetPos() - 256 * 2;m_nBlue = m_nSliderBlue = 255;break;case 3:m_nRed = m_nSliderRed = 0;m_nGreen = m_nSliderGreen = 255;m_nBlue = m_nSliderBlue = 255 - (m_SliderColor.GetPos() - 256 * 3);break;case 4:m_nRed = m_nSliderRed = m_SliderColor.GetPos() - 256 * 4;m_nGreen = m_nSliderGreen = 255;m_nBlue = m_nSliderBlue = 0;break;case 5:m_nRed = m_nSliderRed = 255;m_nGreen = m_nSliderGreen = 255 - (m_SliderColor.GetPos() - 256 * 5);m_nBlue = m_nSliderBlue = 0;break;default:;UpdateData(FALSE);/*作用:红色文本框内容改变的响应函数*/void CColorDlg:OnEnChangeEditRed()UpdateData(TRUE);/ 限定取值范围if (m_nRed 255)m_nRed = 255;else if (m_nRed 255)m_nGreen = 255;else if (m_nGreen 255)m_nBlue = 255;else if (m_nBlue 360)m_nH = 360;else if (m_nH 100)m_nS = 100;else if (m_nS 100)m_nV = 100;else if (m_nV GetPixel(x, y);m_nSliderRed = m_nRed = GetRValue(clr);m_nSliderGreen = m_nGreen = GetGValue(clr);m_nSliderBlue = m_nBlue = GetBValue(clr);UpdateData(FALSE);UpdateHSV();UpdatePrev();ReleaseDC(pDC);/*作用:屏幕取色处理函数*备注:用户按a键时响应*/BOOL CColorDlg:PreTranslateMessage(MSG* pMsg)/ 如果用户按下a键(不论大小写),进行屏幕取色处理if(pMsg-message = WM_KEYDOWN & (pMsg-wParam = a | pMsg-wParam = A)CDC* pDC = CDC:FromHandle(:GetDC(NULL); /获取屏幕CDC指针CPoint point;GetCursorPos(&point);/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东中共中山市委政法委员会所属事业单位招聘事业单位人员4人模拟试卷及答案详解(网校专用)
- 2025辽宁沈阳城市建设投资集团有限公司所属企业沈阳城投新能源集团有限公司招聘7人考前自测高频考点模拟试题及参考答案详解一套
- 2025年蚌埠市龙子湖区产业发展有限公司招聘22人模拟试卷附答案详解(完整版)
- 2025广西平果市农业机械化服务中心城镇公益性岗位人员招聘1人考前自测高频考点模拟试题及参考答案详解一套
- 2025年宁波市北仑区卫生健康系统第二批招聘事业编制工作人员123人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025广东汕头大学医学院教务处医学教育拓展项目教辅人员招聘1人考前自测高频考点模拟试题有答案详解
- 2025广东佛山市中心血站南海血站招聘公益一类事业编制工作人员2人模拟试卷及答案详解(全优)
- 2025年临沂兰山区教育和体育局部分事业单位公开招聘教师(55名)模拟试卷及答案详解(网校专用)
- 2025年安徽理工大学第一附属医院第二批紧缺岗位招聘14人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025辽宁大连医科大学附属第一医院招聘(截止11.30)模拟试卷有完整答案详解
- T/CCAS 010-2019水泥窑协同处置飞灰预处理产品水洗氯化物
- DB37-T1317-2025超细干粉灭火系统技术规范
- 2025校招:网络工程面试题库及答案
- 头皮撕脱伤的护理常规
- 麻醉器械耗材管理制度
- 面向未来的《义务教育语文课程标准(2025年版)》解读
- 2025-2030中国口腔医疗行业发展分析及投资前景与战略规划研究报告
- 《流量计培训》课件
- 酒店残疾人服务工作流程
- 中华民族共同体概论讲稿专家版《中华民族共同体概论》大讲堂之第三讲 文明初现与中华民族起源(史前时期)
- 公路工程技术创新管理制度
评论
0/150
提交评论