我想更改图片的HSV值。我在下面写了代码。不幸的是,当我这样做时,我得到了那个结果:
可以或我做错了吗?如果您有任何疑问,请写信给我。我希望你知道我的意思。谢谢!
#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);
}
}
}
答案 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上进行必要的像素处理。