zoukankan      html  css  js  c++  java
  • Rgb和Hsv相互转换的方法!


      以下是我在进行Rgb和Hsv色彩模式相互转换的方法,经过两个软件使用和测试!挖坑笔记!

      

    using System;
    using System.Drawing;

    namespace EngTyping.Class
    {
        
    /// <summary>
        
    /// ColorHandle 处理Rgb|Hsv的相互转换
        
    /// </summary>

        internal class ColorHandle
        
    {
            
    public int H,S,V;
            
    public int R,G,B;
            
    public int C,M,Y,K;
            
    /// <summary>
            
    /// 处理Rgb到Hsv的转换
            
    /// </summary>
            
    /// <param name="R"></param>
            
    /// <param name="G"></param>
            
    /// <param name="B"></param>
            
    /// 

            public void RgbToHsv(int R,int G,int B)
            
    {
                Color MyColor
    =Color.FromArgb(R,G,B);
                H
    =Convert.ToInt32(MyColor.GetHue());

                
    //奇怪——用微软自己的方法获得的S值和V值居然不对
                
    //S=Convert.ToInt32(MyColor.GetSaturation()/255*100);
                
    //V=Convert.ToInt32(MyColor.GetBrightness()/255*100);

                
    decimal min;
                
    decimal max;
                
    decimal delta;

                
    decimal R1=Convert.ToDecimal(R)/255;
                
    decimal G1=Convert.ToDecimal(G)/255;
                
    decimal B1=Convert.ToDecimal(B)/255;

                min 
    = Math.Min(Math.Min(R1, G1), B1);
                max 
    = Math.Max(Math.Max(R1, G1), B1);
                V 
    = Convert.ToInt32(max*100);
                delta 
    = (max - min)*100;

                
    if (max == 0 || delta == 0)
                    S 
    = 0;
                
    else
                    S 
    = Convert.ToInt32(delta / max);
                
            }



            
    public void RgbToHsv(Color MyColor)
            
    {
                
    //Color MyColor=Color.FromArgb(R,G,B);
                int R = MyColor.R;
                
    int G = MyColor.G;
                
    int B = MyColor.B;
                H
    =Convert.ToInt32(MyColor.GetHue());

                
    //奇怪——用微软自己的方法获得的S值和V值居然不对
                
    //S=Convert.ToInt32(MyColor.GetSaturation()/255*100);
                
    //V=Convert.ToInt32(MyColor.GetBrightness()/255*100);

                
    decimal min;
                
    decimal max;
                
    decimal delta;

                
    decimal R1=Convert.ToDecimal(R)/255;
                
    decimal G1=Convert.ToDecimal(G)/255;
                
    decimal B1=Convert.ToDecimal(B)/255;

                min 
    = Math.Min(Math.Min(R1, G1), B1);
                max 
    = Math.Max(Math.Max(R1, G1), B1);
                V 
    = Convert.ToInt32(max*100);
                delta 
    = (max - min)*100;

                
    if (max == 0 || delta == 0)
                    S 
    = 0;
                
    else
                    S 
    = Convert.ToInt32(delta / max);
                
            }


            
    /// <summary>
            
    /// 处理Hsv到Rgb的转换
            
    /// </summary>
            
    /// <param name="H"></param>
            
    /// <param name="S"></param>
            
    /// <param name="V"></param>

            public void HsvToRgb(int H,int S,int V)
            
    {

                H
    =Convert.ToInt32(Convert.ToDecimal( H )/360*255);
                S
    =Convert.ToInt32(Convert.ToDecimal( S )/100*255);
                V
    =Convert.ToInt32(Convert.ToDecimal( V )/100*255);

                
    if (S==0)
                
    {
                    R
    =0;
                    G
    =0;
                    B
    =0;
                }


                
    decimal fractionalSector;
                
    decimal sectorNumber;
                
    decimal sectorPos;
                sectorPos 
    = (Convert.ToDecimal(H)/255*360)/60;
                sectorNumber 
    = Convert.ToInt32(Math.Floor(Convert.ToDouble(sectorPos)));
                fractionalSector 
    = sectorPos - sectorNumber;

                
    decimal p;
                
    decimal q;
                
    decimal t;

                
    decimal r=0;
                
    decimal g=0;
                
    decimal b=0;
                
    decimal ss=Convert.ToDecimal(S)/255;
                
    decimal vv=Convert.ToDecimal(V)/255;
                
                
                p 
    =vv * (1 - ss);
                q 
    = vv * (1 - (ss * fractionalSector));
                t 
    = vv * (1 - (ss * (1 - fractionalSector)));
              
                
    switch (Convert.ToInt32(sectorNumber))
                
    {
                    
    case 0:
                    
                        r 
    =vv;
                        g 
    = t;
                        b 
    = p;
                        
    break;
                
                    
    case 1:
                        r 
    = q;
                        g 
    = vv;
                        b 
    = p;
                        
    break;
                    
    case 2:
                    
                        r 
    = p;
                        g 
    = vv;
                        b 
    = t;
                        
    break;
                    
    case 3:
                    
                        r 
    = p;
                        g 
    = q;
                        b 
    = vv;
                        
    break;
                    
    case 4:
                    
                        r 
    = t;
                        g 
    = p;
                        b 
    = vv;
                        
    break;
                    
    case 5:
                    
                        r 
    = vv;
                        g 
    = p;
                        b 
    = q;
                        
    break;    
                }

                R
    = Convert.ToInt32(r * 255);  
                G
    = Convert.ToInt32(g * 255);  
                B
    = Convert.ToInt32(b * 255);  
         
            }

            
    /// <summary>
            
    /// RgbtoCmy
            
    /// </summary>
            
    /// <param name="R"></param>
            
    /// <param name="G"></param>
            
    /// <param name="B"></param>

            public void RgbToCmyk(decimal R,decimal G,decimal B)
            
    {
                C 
    = Convert.ToInt32((255 - Math.Abs(R)) * 100 / 255);
           
                M 
    = Convert.ToInt32((255 - Math.Abs(G)) * 100 / 255);
          
                Y 
    = Convert.ToInt32((255 - Math.Abs(B)) * 100 / 255);
            }

        }

    }


  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/amwson/p/726931.html
Copyright © 2011-2022 走看看