天天看點

qt label顯示圖檔_C++程式設計:Qt "顔色減淡"算法Qt開發環境 Qt5.5.1、Qt Creator 3.5.1

qt label顯示圖檔_C++程式設計:Qt "顔色減淡"算法Qt開發環境 Qt5.5.1、Qt Creator 3.5.1

Qt開發環境 Qt5.5.1、Qt Creator 3.5.1

“顔色減淡”模式的公式是:基色+(基色*混合色)/(255-混合色)= 結果色,其中(255-混合色)當于混合色的反相。

1、若混合色為0(黑色),則由于(基色*混合色)這項為0,則結果色等于基色,圖像不發生變化;基混合色為128(50%的黑),情況分為兩種:

(1)當基色小于128時,結果色等于2基色,由于這個數值小于255是以呈某種階調的灰。

(2)而當基色大于128(50%的黑)時,結果色等于2基色,這個值是大于255值,255(白色);

2、若混合色為255(白色),則混合色的反相為0,無論基色為何值,結果色都大于255,歸為255(白色)。

下面是Qt的實作代碼

1、mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H #include #include #include  namespace Ui {class MainWindow;} class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();public slots: void onSliderValueChange(int value);private: Ui::MainWindow *ui; //圖像顯示寬度 int width; //圖像顯示高度 int height; //圖像 QImage image; //将圖檔設定到label上作為背景 void setLabelImage(QLabel *widget, const QImage &image); //擷取顔色減淡算法生成的圖檔 void getNewImage(int secondaryColors, QImage* outImage); //顔色減淡算法(基色+(基色*混合色)/(255-混合色)= 結果色) uint colorDodgeAlgorithm(int primaryColor, int secondaryColors);}; #endif // MAINWINDOW_H
           

2、mainwindow.cpp

#include "mainwindow.h"
           
#include "ui_mainwindow.h"
           
MainWindow::MainWindow(QWidget *parent) :
           
QMainWindow(parent),
           
ui(new Ui::MainWindow)
           
ui->setupUi(this);
           
ui->horizontalSlider->setMinimum(0);
           
ui->horizontalSlider->setMaximum(255);
           
connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderValueChange(int)));
           
onSliderValueChange(ui->horizontalSlider->value());
           
width = ui->label_image1->width();
           
height = ui->label_image1->height();
           
image = QImage("D:/cx-檔案/Desktop/d4b07c36acaf2edd45eece0a8a1001e938019374.jpg").scaled(width, height);
           
width = image.width();
           
height = image.height();
           
setLabelImage(ui->label_image1, image);
           
setLabelImage(ui->label_image2, image);
           
}
           
widget->setAutoFillBackground(true);
           
QPalette palette = widget->palette();
           
palette.setBrush(QPalette::Window, QBrush(image));
           
widget->setPalette(palette);
           
}
           
for(int i=0; i
           
for(int j=0; j
           
QRgb rgb = image.pixel(i,j);
           
// QColor rgbColor = QColor::fromRgb(rgb);
           
//float hue; // [0,360] 色調(色相)
           
//float saturation; // [0,100] 飽和度
           
//float luminance; // [0,100] 亮度
           
// QColor hslColor = rgbColor.toHsl();
           
// int h,s,l;
           
// hslColor.getHsl(&h, &s, &l);
           
// l *= secondaryColors / 255;
           
// l = colorDodgeAlgorithm(l, secondaryColors);
           
// hslColor = QColor::fromHsl(h,s,l);
           
int r = qRed(rgb);
           
int g = qGreen(rgb);
           
int b = qBlue(rgb);
           
uint resultR = colorDodgeAlgorithm(r, secondaryColors);
           
uint resultG = colorDodgeAlgorithm(g, secondaryColors);
           
uint resultB = colorDodgeAlgorithm(b, secondaryColors);
           
uint resultRgb = ((resultR & 255)<<16 | (resultG & 255)<<8 | (resultB & 255));
           
outImage->setPixel(i, j, resultRgb);
           
// outImage->setPixel(i, j, colorDodgeAlgorithm(rgb, secondaryColors));
           
// outImage->setPixel(i, j, hslColor.rgb());
           
}
           
}
           
}
           
uint MainWindow::colorDodgeAlgorithm(int primaryColor, int secondaryColors)
           
return 255;
           
}
           
//基色 +(基色*混合色)/(255-混合色)= 結果色
           
int result = (primaryColor + (uint)(primaryColor*secondaryColors) / (255 - secondaryColors));
           
// int result = primaryColor - secondaryColors;
           
result = 255;
           
result = 0;
           
}
           
return result;
           
}
           
void MainWindow::onSliderValueChange(int value)
           
ui->label_slider_value->setText(QString("%1 / %2").arg(QString::number(value)).arg(QString::number(ui->horizontalSlider->maximum())));
           
return;
           
}
           
// uint secondaryColors;
           
// secondaryColors = 0;
           
// secondaryColors = 4294967295;
           
// secondaryColors = (uint)(429496729.5 * value);
           
// }
           
QImage *outImage = new QImage(width, height, QImage::Format_RGB32);
           
getNewImage(value, outImage);
           
setLabelImage(ui->label_image2, *outImage);
           
}
           
MainWindow::~MainWindow()
           
delete ui;
           
}
           

上面的注釋中有我演算其它圖形圖像算法的一些代碼,是以看起來有點亂,不過不影響整體效果

軟體實際截圖

qt label顯示圖檔_C++程式設計:Qt "顔色減淡"算法Qt開發環境 Qt5.5.1、Qt Creator 3.5.1