我想描绘一下:
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();
}
答案 0 :(得分:1)
首先,尝试在QColor类中使用已经实现的HSV到RGB从HSV到RGB的颜色转换 - QColor::fromHsvF()
其次,您在on_V_slider_valueChanged
和on_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();
};