对于刚接触QT的我来说,其实很陌生,一开始就来输入输出都搞不懂,当明白了qt的原理后,就发现其实qt做起界面来还是挺方面,容易操作的,一下是一次简单的实验,可以改进的地方还是有多,我写的只是一个很基础的操作像素的实验。
1.首先搭建起一个简单的图形界面
2.对两个按钮添加槽函数,一个是正常显示图片,另一个是把图片涂黑,再展现出来,代码如下
void MainWindow::on_pushButton_clicked()
{
//ui->label->setPixmap(QPixmap("1.png"));
pPixmap=new QPixmap("1.png");
ui->label->setPixmap(*pPixmap);
ui->pushButton->setDisabled(true);
}
void MainWindow::on_pushButton_2_clicked()
{
QImage image=pPixmap->toImage();
unsigned char *pData=image.bits();
int width=image.width();
int height=image.height();
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
*(pData+(i*width+j)*4)=0;
*(pData+(i*width+j)*4+1)=0;
*(pData+(i*width+j)*4+2)=0;
}
}
QPixmap ConvertPixmap=QPixmap::fromImage(image);
//memset(pData,width*height*4,0);
ui->label_2->setPixmap(ConvertPixmap);
}
3.使用了slider滑条来控制图片像素的变化
拖动滑条,可以看到图片从全黑到原图的一个变化过程,代码如下:
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
QImage image=pPixmap->toImage();
unsigned char *pData=image.bits(); //找到图片指针的首地址
int width=image.width();
int height=image.height();
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
*(pData+(i*width+j)*4)=(*(pData+(i*width+j)*4)*value/255); //B变换
*(pData+(i*width+j)*4+1)=(*(pData+(i*width+j)*4+1)*value/255); //G变换
*(pData+(i*width+j)*4+2)=(*(pData+(i*width+j)*4+2)*value/255); //R变换
}
}
QPixmap ConvertPixmap=QPixmap::fromImage(image); //把像素转换回QPixmap格式
//memset(pData,width*height*4,0);
ui->label_2->setPixmap(ConvertPixmap);
}
4.以下是整个工程的代码
(1)mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_horizontalSlider_valueChanged(int value);
private:
Ui::MainWindow *ui;
QPixmap *pPixmap;
};
#endif // MAINWINDOW_H
(2)mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->horizontalSlider->setRange(0,255); //设置slider的范围在0~255
ui->label->setText(" "); //清空label内容
ui->label_2->setText(" "); //清空labe_2内容
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//ui->label->setPixmap(QPixmap("1.png")); //导入图片
pPixmap=new QPixmap("1.png"); //new一个对象实例化,导入图片, pPixmap在mainwindow.h 中定义了 QPixmap *pPixmap;
ui->label->setPixmap(*pPixmap); //在label中显示图片
ui->pushButton->setDisabled(true); //禁用pushButton
}
void MainWindow::on_pushButton_2_clicked()
{
QImage image=pPixmap->toImage();
unsigned char *pData=image.bits();
int width=image.width();
int height=image.height();
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
*(pData+(i*width+j)*4)=0; //B
*(pData+(i*width+j)*4+1)=0; //G
*(pData+(i*width+j)*4+2)=0; //R
}
}
QPixmap ConvertPixmap=QPixmap::fromImage(image);
//memset(pData,width*height*4,0); //memset函数,把pData字符串把width*height*4长度内容全部清空 ,方法等同上面两个for循环
ui->label_2->setPixmap(ConvertPixmap);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
QImage image=pPixmap->toImage();
unsigned char *pData=image.bits();
int width=image.width();
int height=image.height();
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
*(pData+(i*width+j)*4)=(*(pData+(i*width+j)*4)*value/255);
*(pData+(i*width+j)*4+1)=(*(pData+(i*width+j)*4+1)*value/255);
*(pData+(i*width+j)*4+2)=(*(pData+(i*width+j)*4+2)*value/255);
}
}
QPixmap ConvertPixmap=QPixmap::fromImage(image);
//memset(pData,width*height*4,0);
ui->label_2->setPixmap(ConvertPixmap);
}