CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  GAME,图形处理/多媒体

怎样实现像photoshop中那样调节图片色调(Hue)??特急!答对立即给分。

楼主eliphe(未来)2003-08-03 19:06:34 在 Delphi / GAME,图形处理/多媒体 提问

怎样实现像photoshop中那样调节图片色调(Hue)??  
   
  要求:给出代码。  
   
  请高手回答。      
   
  答对立即给分。 问题点数:50、回复次数:3Top

1 楼lihao_ningxia(耗子)回复于 2003-08-04 09:29:31 得分 2

WINDOWS提供了很多相关API,你找本关于图形图象的编程方面的书看看,DELPHI这方面的不是很经典,找C++或VC的看看Top

2 楼cnssk(小柯)回复于 2003-08-04 11:05:56 得分 40

C的代码自己看看算法  
   
   
  一个picturebox中的图片,如何在不调用directX的情况下,动态修改图片的HUE值?有  
  没有什么现成的API?这个功能太常用了,多数图形软件都可以调整色阶的,应该有什  
  么函数可以设置吧。  
   
  shlwapi.h里面有两个函数,ColorRGBToHLS和ColorHLSToRGB,应该可以满足你的要  
  求,但是要一个点一个点地算,有点慢。  
   
  这里还有两个函数,你可以自己想办法提高效率:  
   
        */  
        #define     HLSMAX       RANGE   /*   H,L,   and   S   vary   over   0-HLSMAX   */  
        #define     RGBMAX       255       /*   R,G,   and   B   vary   over   0-RGBMAX   */  
                                                        /*   HLSMAX   BEST   IF   DIVISIBLE   BY   6   */  
                                                        /*   RGBMAX,   HLSMAX   must   each   fit   in   a   byte.   */  
   
        /*   Hue   is   undefined   if   Saturation   is   0   (grey-scale)   */  
        /*   This   value   determines   where   the   Hue   scrollbar   is   */  
        /*   initially   set   for   achromatic   colors   */  
        #define   UNDEFINED   (HLSMAX*2/3)  
   
        void     RGBtoHLS(DWORD   lRGBColor)  
        {  
              WORD   R,G,B;                     /*   input   RGB   values   */  
              BYTE   cMax,cMin;             /*   max   and   min   RGB   values   */  
        WORD     Rdelta,Gdelta,Bdelta;   /*   intermediate   value:   %   of   spread   from   max  
   
        */  
              /*   get   R,   G,   and   B   out   of   DWORD   */  
              R   =   GetRValue(lRGBColor);  
              G   =   GetGValue(lRGBColor);  
              B   =   GetBValue(lRGBColor);  
   
              /*   calculate   lightness   */  
              cMax   =   max(   max(R,G),   B);  
              cMin   =   min(   min(R,G),   B);  
              L   =   (   ((cMax+cMin)*HLSMAX)   +   RGBMAX   )/(2*RGBMAX);  
   
              if   (cMax   ==   cMin)   {                       /*   r=g=b   -->   achromatic   case   */  
                    S   =   0;                                           /*   saturation   */  
                    H   =   UNDEFINED;                           /*   hue   */  
              }  
              else   {                                                 /*   chromatic   case   */  
                    /*   saturation   */  
                    if   (L   <=   (HLSMAX/2))  
                          S   =   (   ((cMax-cMin)*HLSMAX)   +   ((cMax+cMin)/2)   )   /   (cMax+cMin);  
                    else  
                          S   =   (   ((cMax-cMin)*HLSMAX)   +   ((2*RGBMAX-cMax-cMin)/2)   )  
                                /   (2*RGBMAX-cMax-cMin);  
   
                    /*   hue   */  
              Rdelta   =   (   ((cMax-R)*(HLSMAX/6))   +   ((cMax-cMin)/2)   )   /   (cMax-cMin);  
              Gdelta   =   (   ((cMax-G)*(HLSMAX/6))   +   ((cMax-cMin)/2)   )   /   (cMax-cMin);  
              Bdelta   =   (   ((cMax-B)*(HLSMAX/6))   +   ((cMax-cMin)/2)   )   /   (cMax-cMin);  
   
                    if   (R   ==   cMax)  
                          H   =   Bdelta   -   Gdelta;  
                    else   if   (G   ==   cMax)  
                          H   =   (HLSMAX/3)   +   Rdelta   -   Bdelta;  
                    else   /*   B   ==   cMax   */  
                          H   =   ((2*HLSMAX)/3)   +   Gdelta   -   Rdelta;  
   
                    if   (H   <   0)  
                          H   +=   HLSMAX;  
                    if   (H   >   HLSMAX)  
                          H   -=   HLSMAX;  
              }  
        }  
        /*   utility   routine   for   HLStoRGB   */  
        WORD   HueToRGB(WORD   n1,   WORD   n2,   WORD   hue)  
        {  
              /*   range   check:   note   values   passed   add/subtract   thirds   of   range   */  
              if   (hue   <   0)  
                    hue   +=   HLSMAX;  
   
              if   (hue   >   HLSMAX)  
                    hue   -=   HLSMAX;  
   
              /*   return   r,g,   or   b   value   from   this   tridrant   */  
              if   (hue   <   (HLSMAX/6))  
                      return   (   n1   +   (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6))   );  
              if   (hue   <   (HLSMAX/2))  
                    return   (   n2   );  
              if   (hue   <   ((HLSMAX*2)/3))  
                    return   (   n1   +  
  (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6))  
        );  
              else  
                    return   (   n1   );  
        }  
   
        DWORD   HLStoRGB(WORD   hue,WORD   lum,WORD   sat)  
          {  
                WORD   R,G,B;                                 /*   RGB   component   values   */  
              WORD     Magic1,Magic2;               /*   calculated   magic   numbers   (really!)   */  
   
              if   (sat   ==   0)   {                         /*   achromatic   case   */  
                    R=G=B=(lum*RGBMAX)/HLSMAX;  
                    if   (hue   !=   UNDEFINED)   {  
                          /*   ERROR   */  
                      }  
                }  
              else     {                                         /*   chromatic   case   */  
                    /*   set   up   magic   numbers   */  
                    if   (lum   <=   (HLSMAX/2))  
                          Magic2   =   (lum*(HLSMAX   +   sat)   +   (HLSMAX/2))/HLSMAX;  
                    else  
                          Magic2   =   lum   +   sat   -   ((lum*sat)   +   (HLSMAX/2))/HLSMAX;  
                    Magic1   =   2*lum-Magic2;  
   
                    /*   get   RGB,   change   units   from   HLSMAX   to   RGBMAX   */  
                    R   =   (HueToRGB(Magic1,Magic2,hue+(HLSMAX/3))*RGBMAX   +  
        (HLSMAX/2))/HLSMAX;  
                    G   =   (HueToRGB(Magic1,Magic2,hue)*RGBMAX   +   (HLSMAX/2))   /   HLSMAX;  
                    B   =   (HueToRGB(Magic1,Magic2,hue-(HLSMAX/3))*RGBMAX   +  
        (HLSMAX/2))/HLSMAX;  
              }  
              return(RGB(R,G,B));  
          }  
   
   
  Top

3 楼cnssk(小柯)回复于 2003-08-04 14:41:23 得分 8

procedure   RGBtoHSL(R,G,B:Integer;var   H,S,L:Integer);  
  var  
      Delta   :   Double;  
      CMax,CMin   :   Double;  
      Red,Green,Blue,Hue,Sat,Lum   :   Double;  
  begin  
      Red   :=   R/255;  
      Green   :=   G/255;  
      Blue   :=   B/255;  
      CMax   :=   Max(Red,Max(Green,Blue));  
      CMin   :=   Min(Red,Min(Green,Blue));  
      Lum   :=   (CMax+CMin)/2;  
      if   CMax   =   CMin   then   begin  
          Sat   :=   0;  
          Hue   :=   0;  
      end  
      else   begin  
          if   Lum   <   0.5   then   Sat   :=   (CMax-CMin)/(CMax+CMin)  
          else   Sat   :=   (cmax-cmin)/(2-cmax-cmin);  
          delta   :=   CMax-CMin;  
          If   Red   =   CMax   then   Hue   :=   (Green-Blue)/Delta  
          else   if   Green   =   CMax   then   Hue   :=   2+(Blue-Red)/Delta  
          else   Hue   :=   4.0+(Red-Green)/Delta;  
          Hue   :=   Hue   /   6;  
          If   Hue   <   0   then   Hue   :=   Hue   +   1;  
      end;  
      H   :=   Round(Hue*360);  
      S   :=   Round(Sat*100);  
      L   :=   Round(Lum*100);  
  end;  
  Top

相关问题

  • 请问PHOTOSHOP中怎样将一幅图片弄成以某种色调为主?
  • qq中根据色调和亮度来调节界面的颜色和明暗,如果转换成RGB改怎么转换啊?
  • 调节音量
  • photoshop
  • 网站色调问题!
  • 图像调节(高分)
  • 音量调节的算法
  • 256色调色板设置问题
  • 调节气氛:笑话一则
  • vb中怎样调节系统音量?

关键词

  • 函数
  • word
  • hlsmax
  • hue
  • rgbmax
  • cmax
  • lrgbcolor
  • cmin
  • 图片
  • 看看

得分解答快速导航

  • 帖主:eliphe
  • lihao_ningxia
  • cnssk
  • cnssk

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo