一、QImage是什么?
QImage是QT中最基本的图像处理类,它可以用来加载、显示、保存、特效处理数字图像,支持BMP,JPEG,PNG等多种图片格式。相对于QPixmap,它更为全面、强大。
二、QImage读取图片的基本操作
1. 读取一张图片
#include <QApplication>
#include <QLabel>
#include <QImage>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QImage img(":/images/image.jpg"); // 读取本地图片
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
2. 在图片上绘制文字和图形
#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QImage img(":/images/image.jpg");
QPainter painter(&img); // 创建QPainter对象
painter.setPen(QColor(255, 0, 0)); // 设置画笔颜色
painter.drawText(QRect(0, 0, img.width(), 50), "Hello World!"); // 在图片上绘制文本
painter.setBrush(QBrush(QColor(0, 255, 0))); // 设置画刷颜色
painter.drawRect(QRect(50, 50, 100, 100)); // 在图片上绘制矩形
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
3. 裁剪、缩放和旋转图片
#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QTransform>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QImage img(":/images/image.jpg");
// 裁剪图片
img = img.copy(QRect(50, 50, 100, 100));
// 缩放图片
img = img.scaled(QSize(200, 200), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 旋转图片
QTransform transform;
transform.rotate(45);
img = img.transformed(transform, Qt::SmoothTransformation);
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
三、使用QImage加载网络图片
1. 使用QNetworkAccessManager从网络上下载图片
#include <QApplication>
#include <QLabel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QByteArray>
#include <QBuffer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 初始化网络请求
QNetworkAccessManager manager;
QNetworkRequest request(QUrl("https://www.example.com/image.jpg"));
QNetworkReply *reply = manager.get(request);
// 等待图片加载完成
while (!reply->isFinished()) {
qApp->processEvents();
}
// 读取图片数据
QByteArray data = reply->readAll();
// 将字节数组转换为QImage对象
QImage img;
img.loadFromData(data);
// 显示图片
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
2. 直接使用QImage加载网络图片
#include <QApplication>
#include <QLabel>
#include <QUrl>
#include <QImageReader>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 初始化QImageReader
QImageReader reader(QUrl("https://www.example.com/image.jpg"));
reader.setAutoTransform(true);
// 读取图片
QImage img = reader.read();
// 显示图片
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
四、QImage的高级用法
1. 使用QImage进行图像处理
#include <QApplication>
#include <QLabel>
#include <QImage>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QImage img(":/images/image.jpg");
// 转为灰度图像
img = img.convertToFormat(QImage::Format_Grayscale8);
// 像素级操作
for (int x = 0; x < img.width(); x++) {
for (int y = 0; y < img.height(); y++) {
int gray = qGray(img.pixel(x, y)); // 获取当前像素点的灰度值
img.setPixel(x, y, qRgb(gray, gray, gray)); // 设置当前像素点的RGB值为灰度值
}
}
// 显示图片
QLabel label;
label.setPixmap(QPixmap::fromImage(img));
label.show();
return a.exec();
}
2. 使用QImage进行图像特效处理
#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QRgb>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QImage img(":/images/image.jpg");
// 边缘检测
QImage edge = img.copy();
edge = edge.convertToFormat(QImage::Format_Grayscale8);
for (int x = 1; x < img.width() - 1; x++) {
for (int y = 1; y < img.height() - 1; y++) {
int gx = qGray(edge.pixel(x + 1, y)) - qGray(edge.pixel(x - 1, y));
int gy = qGray(edge.pixel(x, y + 1)) - qGray(edge.pixel(x, y - 1));
int gray = qSqrt(gx * gx + gy * gy);
edge.setPixel(x, y, qRgb(gray, gray, gray));
}
}
// 反色
QImage invert = img;
for (int x = 0; x < img.width(); x++) {
for (int y = 0; y < img.height(); y++) {
QRgb color = img.pixel(x, y);
int r = 255 - qRed(color);
int g = 255 - qGreen(color);
int b = 255 - qBlue(color);
invert.setPixel(x, y, qRgb(r, g, b));
}
}
// 显示特效处理后的图片
QWidget widget;
QLabel *label1 = new QLabel(&widget);
QLabel *label2 = new QLabel(&widget);
label1->setPixmap(QPixmap::fromImage(edge));
label2->setPixmap(QPixmap::fromImage(invert));
QHBoxLayout *layout = new QHBoxLayout(&widget);
layout->addWidget(label1);
layout->addWidget(label2);
widget.setLayout(layout);
widget.show();
return a.exec();
}