HSV与RGB之间相互转换

代码来自http://www.cocoabuilder.com/archive/cocoa/198570-here-is-code-to-convert-rgb-hsb.html

C语言,可在Object-C中调用

#define UNDEFINED 0

typedef struct {float r, g, b;} RGBType;
typedef struct {float h, s, v;} HSVType;

// Theoretically, hue 0 (pure red) is identical to hue 6 in these transforms. Pure
// red always maps to 6 in this implementation. Therefore UNDEFINED can be
// defined as 0 in situations where only unsigned numbers are desired.
RGBType RGBTypeMake(float r, float g, float b);
HSVType HSVTypeMake(float h, float s, float v);

HSVType RGB_to_HSV( RGBType RGB );
RGBType HSV_to_RGB( HSVType HSV );
#include <math.h>
#include "HSV.h"

inline RGBType RGBTypeMake(float r, float g, float b)
{
	RGBType rgb = {r, g, b};
	return rgb;
}

inline HSVType HSVTypeMake(float h, float s, float v)
{
	HSVType hsv = {h, s, v};
	return hsv;
}

HSVType RGB_to_HSV( RGBType RGB )
{
    // RGB are each on [0, 1]. S and V are returned on [0, 1] and H is
    // returned on [0, 1]. Exception: H is returned UNDEFINED if S==0.
    float R = RGB.r, G = RGB.g, B = RGB.b, v, x, f;
    int i;

    x = fminf(R, G);
    x = fminf(x, B);

    v = fmaxf(R, G);
    v = fmaxf(v, B);

    if(v == x)
		return HSVTypeMake(UNDEFINED, 0, v);

    f = (R == x) ? G - B : ((G == x) ? B - R : R - G);
    i = (R == x) ? 3 : ((G == x) ? 5 : 1);

    return HSVTypeMake(((i - f /(v - x))/6), (v - x)/v, v);
}

RGBType HSV_to_RGB( HSVType HSV )
{
    // H is given on [0, 1] or UNDEFINED. S and V are given on [0, 1].
    // RGB are each returned on [0, 1].
    float h = HSV.h * 6, s = HSV.s, v = HSV.v, m, n, f;
    int i;

    if (h == 0) h=.01;
    if(h == UNDEFINED)
		return RGBTypeMake(v, v, v);
    i = floorf(h);
    f = h - i;
    if(!(i & 1)) f = 1 - f; // if i is even
    m = v * (1 - s);
    n = v * (1 - s * f);
    switch (i)
	{
        case 6:
        case 0: return RGBTypeMake(v, n, m);
        case 1: return RGBTypeMake(n, v, m);
        case 2: return RGBTypeMake(m, v, n);
        case 3: return RGBTypeMake(m, n, v);
        case 4: return RGBTypeMake(n, m, v);
        case 5: return RGBTypeMake(v, m, n);
	}
    return RGBTypeMake(0, 0, 0);
}
时间: 2024-11-10 13:16:44

HSV与RGB之间相互转换的相关文章

C++ 中 int,char*,string,CString之间相互转换-整理

#include <string> //使用C++标准库的string类时 using namespace std; //同上 #include <sstream> #include <iostream> #include <stdlib.h> //要将string类和int类型直接转换最好有这些包含, //因为自己写一个转换函数比较方便,函数定义参考如下 string getstring ( const int n ) { std::stringstrea

php中 xml json 数组 之间相互转换

php中 xml json  数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, 'data'=>$data, ); json_encode($result);

HTML(DOM)与JavaScript嵌套数组之间相互转换

1. [代码][JavaScript]代码     /*<html><head>  <title>HTML RESTructure</title><style></style><script>*/// workDOM函数遍历目标元素或节点// 有两种模式://   1. `element`模式(默认)(包含所定义的元素项)//   2. `node`模式(包含文本节点在内的所有节点)function walkDOM(mod

WebService(2)-XML系列之Java和Xml之间相互转换

源码下载:链接:http://pan.baidu.com/s/1ntL1a7R 密码: rwp1 本文主要讲述:使用jaxb完成对象和xml之间的转换 TestJava2xml.java如下所示: package com.tgb.jaxb.v1; import java.io.StringReader; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Mar

Long和Date数据类型之间相互转换代码

static final SimpleDateFormat DATETIME_SEC_STR = new SimpleDateFormat("yyyyMMddHHmmss"); 1.Date转Long Long currStartTime = Long.valueOf(DATETIME_SEC_STR.format(new Date())); System.err.println("LONG1: " + currStartTime); 2.Long转Date Dat

QString, string, int, char* 之间相互转换

这三种数据类型在实际运用中经常需要互相转换,那么这里小结下它们之间的转换方法: - Qstring & string Qt中封装的类十分强大,其成员函数数量之多比STD有过之而无不及,许多程序员抱怨Qt非要整个自己的QSD,为啥不直接支持STD,但是我想说某些时候QST完全可以替代STD,就算不想完全替代,Qt也提供了完整而强大的相互转换的函数,下面我们先来看Qstring和string的相互转换. // string to QString std::string s = "hello

BMP文件格式,RGB之间格式转换 碰到坑,MARK

很多人在转储bmp文件的时候,会出现各种各样的问题,特别是抓屏的时候,经常保存下来的图片 怪怪的,偏差很大!比如下面: 有时候,明明感觉自己是对的,但往往结果很让人抓狂. 这种情况一般是对bmp文件格式理解不对,或者没有透彻导致,当然至少是显示出来,所以大部分是对的,只是某些地方出错! 网上也有很多bmp文件格式,但都说得不够透彻,导致实际总要走些弯路. bmp是常见图片格式,使用非常广泛.近期在处理ui库的时候,了解下bmp格式,也发现其中一些坑,记录下. bmp格式很简单,网上搜索一堆,百科

认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

(一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQuery的优势 1)可以像CSS一样访问和操作DOM 2)修改CSS控制页面外观 3)简化JS代码操作 4)事件代理更加容易 5)动画效果使用方便 6) Ajax技术更加完美 7)大量的基于Jquery的插件 8)可以自定义扩展功能插件 (三)JQuery的语法 格式:$(selector).actio

XML和实体类之间相互转换(序列化和反序列化)

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67