2017-05-18 8 views
0

私の画像のHSV値を変更したい。私は以下のコードを書いた。私はHSVに間違っていますか?

image here

は私が間違っているの何それは大丈夫ですか:私はそれを行うとき、生憎私はその結果を得ましたか。ご質問がありましたら、私にお書きください。私が何を意味するのか知っていれば幸いですありがとう!

#include "widget.h" 
#include "ui_widget.h" 
#include <iostream> 
#include <stdlib.h> 
#include <math.h> 
using namespace std; 

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) 
{ 
    image = QImage("D:/Pobrane/Grafika/Hsv (dla obrazka)/1.jpg"); 
    imagee = QImage("D:/Pobrane/Grafika/Hsv (dla obrazka)/1.jpg"); 
    bits = image.bits(); 
    bitss = imagee.bits(); 
    ui->setupUi(this); 
    h=s=v=0; 
} 

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

void Widget::paintEvent(QPaintEvent*) 
{ 
    QPainter p(this); 
    QImage pix(bitss, 600, 600, QImage::Format_RGB32); 
    p.drawImage(0,0,pix); 
} 

void Widget::on_H_slider_valueChanged(int value) 
{ 
    update(); 
    h=value; 
    imagee=image; 
    for(int i=0; i<imagee.width(); i++) 
    { 
     for(int j=0; j<imagee.height(); j++) 
     { 
      QColor color = imagee.pixelColor(i,j); 
      if (s!=0 && v!=0) color.setHsv(h, s, v, color.alpha()); 
      else if (s!=0) color.setHsv(h, s, color.value(), color.alpha()); 
      else if (v!=0) color.setHsv(h, color.saturation(), v, color.alpha()); 
      else color.setHsv(h, color.saturation(), color.value(), color.alpha()); 
      imagee.setPixelColor(i, j, color); 
     } 
    } 
} 

void Widget::on_S_slider_valueChanged(int value) 
{ 
    update(); 
    s=value; 
    imagee=image; 
    for(int i=0; i<imagee.width(); i++) 
    { 
     for(int j=0; j<imagee.height(); j++) 
     { 
      QColor color = imagee.pixelColor(i,j); 
      if (h!=0 && v!=0) color.setHsv(h, s, v, color.alpha()); 
      else if (h!=0) color.setHsv(h, s, color.value(), color.alpha()); 
      else if (v!=0) color.setHsv(color.hue(), s, v, color.alpha()); 
      else color.setHsv(color.hue(), s, color.value(), color.alpha()); 
      imagee.setPixelColor(i, j, color); 
     } 
    } 
} 

void Widget::on_V_slider_valueChanged(int value) 
{ 
    update(); 
    v=value; 
    imagee=image; 
    for(int i=0; i<imagee.width(); i++) 
    { 
     for(int j=0; j<imagee.height(); j++) 
     { 
      QColor color = imagee.pixelColor(i,j); 
      if (h!=0 && s!=0) color.setHsv(h, s, v, color.alpha()); 
      else if (h!=0) color.setHsv(h, color.saturation(), v, color.alpha()); 
      else if (s!=0) color.setHsv(color.hue(), s, v, color.alpha()); 
      else color.setHsv(color.hue(), color.saturation(), v, color.alpha()); 
      imagee.setPixelColor(i, j, color); 
     } 
    } 
} 
+1

開発環境に付属のデバッガを使用してこのコードをステップ実行すると、環境にデバッグツールが付属していない場合は、プログラムの環境がどこから外れていますか? – user4581301

+0

私は分かりませんが、私のプログラムは間違っていると思います。 – zewukellorre

+0

私は色相と彩度を変更すると大丈夫ですし、色相、彩度と値を変更すると絵のようになるので、これはおそらくVALUEの問題です。 – zewukellorre

答えて

0

私は以前これを経験しました。私の間違いは、常に出力イメージを変更していたことでした。

imageには常に手を触れないでください。
すべての作業はimage2で行う必要があります。
出力もimage2

あなたは、基本的には、1つのスロットonSliderValueChanged(value)にすべてのあなたのvalueChanged()信号を接続することができなければなりません。

擬似コード:

function onSliderValueChanged(value) 
    h = get H slider value 
    s = get S slider value 
    v = get V slider value 
    image2 = image 
    for i = 0 to image2.width - 1 
     for j = 0 to image2.height - 1 
      if h != 0 and s != 0 and v != 0 
       // set image2 pixel color 
       color = QColor::fromHSV(h, s, v) 
       image2.setPixel(i, j, color) 

すべてのスライダ移動、image2は常に最初にimageと同じでなければなりません。
次に、image2で必要なピクセル操作を行います。

+0

ありがとう、私はそれを試したが動作しません、私のコードで変更することはできますか? – zewukellorre

+0

私は最初の投稿で新しいコードを更新します – zewukellorre

+0

私はすでに擬似コードを提供しています。残りは今あなた次第です。あなたが問題を見て、それを自分で解決できるなら、それは素晴らしい達成です。 – codekaizer

関連する問題