HSV到RGB涂料

时间:2017-05-09 18:29:28

标签: c++ qt rgb hsv

我想描绘一下:

HSV

我已经写了那段代码。我使用该网站编写hsvtorgb方法:http://www.rapidtables.com/convert/color/hsv-to-rgb.htm不幸的是,我的代码并没有显示我想要的内容。你能告诉我为什么吗?非常感谢! 我在等待答案

void Widget::hsvtorgb(int h, float s, float v)
{
float C, X, m;
float r, g, b;
C = v * s;
X = C*(1 - abs(((h/60) % 2) - 1));
m = v - C;
if(h>=0 && h<60){r = C; g = X; b = 0;}
if(h>=60 && h<120){r = X; g = C; b = 0;}
if(h>=120 && h<180){r = 0; g = C; b = X;}
if(h>=180 && h<240){r = 0; g = X; b = C;}
if(h>=240 && h<300){r = X; g = 0; b = C;}
if(h>=300 && h<360){r = C; g = 0; b = X;}

R = (r + m) * 255;
G = (g + m) * 255;
B = (b + m) * 255;
}

void Widget::on_H_slider_valueChanged(int value)
{
h=value;
for(int i=0; i<600; i++)
{
    for(int j=0; j<600; j++)
    {
        hsvtorgb(1.0*j/600, 1.0*i/600, v);
        bits[600*4*i+4*j] = B;
        bits[600*4*i+4*j+1] = G;
        bits[600*4*i+4*j+2] = R;
    }
}
update();
}

void Widget::on_S_slider_valueChanged(int value)
{
s=value/100;
for(int i=0; i<600; i++)
{
    for(int j=0; j<600; j++)
    {
        hsvtorgb(h, s, v);
        bits[600*4*i+4*j] = B;
        bits[600*4*i+4*j+1] = G;
        bits[600*4*i+4*j+2] = R;
    }
}
update();
}

void Widget::on_V_slider_valueChanged(int value)
{
v=value/100;
for(int i=0; i<600; i++)
{
    for(int j=0; j<600; j++)
    {
        hsvtorgb(h, s, v);
        bits[600*4*i+4*j] = B;
        bits[600*4*i+4*j+1] = G;
        bits[600*4*i+4*j+2] = R;
    }
}
update();
}

1 个答案:

答案 0 :(得分:1)

首先,尝试在QColor类中使用已经实现的HSV到RGB从HSV到RGB的颜色转换 - QColor::fromHsvF()

其次,您在on_V_slider_valueChangedon_S_slider_valueChanged函数中都有错误。据我了解,你试图在H S和H V颜色空间中显示2d光谱图像,但它只显示一个色块。

以下是如何显示具有固定S值的2d光谱图像的一些示例:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    pixmap(600,200)
{
    ui->setupUi(this);

    recalc();
    ui->img->setPixmap(pixmap);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::recalc()
{
    double S = 1.0;
    QPainter p(&pixmap);

    for (int i = 0; i < 200; i++)
        for (int j = 0; j < 600; j++)
        {
            p.setPen(QColor::fromHsvF(j/599.0, S, i/199.0));
            p.drawPoint(QPoint(j, 199-i));
        }
}

和头文件:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QPixmap pixmap;

    void recalc();
};