我对HSV做错了什么?

时间:2017-05-18 18:15:27

标签: c++ qt

我想更改图片的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 个答案:

答案 0 :(得分:0)

我以前经历过这个。我的错误是我一直在修改输出图像。

确保image始终不受影响 所有工作都应在image2完成 输出也应该是image2

您基本上可以将所有valueChanged()信号连接到一个广告位onSliderValueChanged(value)

伪代码:

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上进行必要的像素处理。