2017-05-09 4 views
-3

をペイント:HSVは、私はそれをペイントする

HSV

私はすでにそのコードを書きました。私はhsvtorgbメソッドを書くためにそのサイトを使用しました:http://www.rapidtables.com/convert/color/hsv-to-rgb.htm Unfortunatelly私のコードは私が望むものを表示しません。なぜか教えてくれますか?どうもありがとう! 私は答え

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(); 
} 
+3

待っている、私たちは待っています質問。 –

+1

_ソリューションで私を助けることができますか? SOは、_特定のプログラミング問題を意味します。 –

+0

私の質問は私が間違っていることですか? – JKSX

答えて

0

まず待っています、QColorクラスのHSVからRGBへのRGBの色変換にすでに実装HSVを使用しよう - QColor::fromHsvF()

第二に、あなたはon_V_slider_valueChanged中とon_S_slider_valueChanged機能でミスを持っています。私が理解しているように、H SとH V色空間に2次元スペクトル画像を表示しようとしましたが、1つのカラーパッチしか表示されませんでした。ここで

が固定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(); 
}; 
関連する問題