QT-相册浏览器 (练习自用)
实现的功能:
1、加载图片 上下查看 缩略图预览(点击缩略图跳转到对应图片)
2、Ctrl+滚轮放大缩小 反色 亮度和对比度调整
效果图如下:
源码放在最后。
1.QLable加载图片 QListWidget加载缩略图 使用QListWidget获取索引值 切换对应图片
QListWidget部分:
QStringList fullPathOfFiles; QString picFileRoad = path; QDir openPicDir(picFileRoad); QStringList filter; filter << "*.jpg" << "*.png" << "*.bmp" << "*.jpeg" << "*.ppm" << "*.JPG" << "*.PNG" << "*.JPEG"; openPicDir.setNameFilters(filter); QStringList picFileList = openPicDir.entryList(filter); for (int i = 0; i < picFileList.size(); i++) { QString picFullDir = picFileRoad + "/" + picFileList.at(i); picNumber == 0 ? fullPathOfFiles.insert(i, picFullDir) : fullPathOfFiles.insert(picNumber + i, picFullDir); QListWidgetItem *signalPicItem = new QListWidgetItem(QIcon(picFullDir), picFullDir); signalPicItem->setSizeHint(QSize(200, 180)); ui.listWidget->addItem(signalPicItem); } ui.listWidget->setCurrentRow(index);
2.反色,亮度和对比度用QImage操作像素
void PhotoViewer::on_actionInverse_triggered() { QImage imgCopy; if (image.format() != QImage::Format_RGB888) { imgCopy = QImage(image).convertToFormat(QImage::Format_RGB888); } else { imgCopy = QImage(image); } uint8_t *rgb = imgCopy.bits(); if (nullptr == rgb) { return; } int size = image.width() * image.height(); for (int i = 0; i < size; i++) { rgb[i * 3] = 255 - rgb[i * 3]; rgb[i * 3 + 1] = 255 - rgb[i * 3 + 1]; rgb[i * 3 + 2] = 255 - rgb[i * 3 + 2]; } //让反色后的图片 也能缩放 image = imgCopy; adaptPicLabelShow(image); } //亮度 QImage AdjustBrightness(QImage Img, int iBrightValue) { int red, green, blue; int pixels = Img.width() * Img.height(); unsigned int *data = (unsigned int *)Img.bits(); for (int i = 0; i < pixels; ++i) { red = qRed(data[i]) + iBrightValue; red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red; green = qGreen(data[i]) + iBrightValue; green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green; blue = qBlue(data[i]) + iBrightValue; blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue; data[i] = qRgba(red, green, blue, qAlpha(data[i])); } return Img; } //对比度 QImage PhotoViewer::AdjustContrast(QImage Img, int arg1) { int pixels = Img.width() * Img.height(); unsigned int *data = (unsigned int *)Img.bits(); int red, green, blue, nRed, nGreen, nBlue; if (arg1 > 0 && arg1 < 100) { float param = 1 / (1 - arg1 / 100.0) - 1; for (int i = 0; i < pixels; ++i) { nRed = qRed(data[i]); nGreen = qGreen(data[i]); nBlue = qBlue(data[i]); red = nRed + (nRed - 127) * param; red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red; green = nGreen + (nGreen - 127) * param; green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green; blue = nBlue + (nBlue - 127) * param; blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue; data[i] = qRgba(red, green, blue, qAlpha(data[i])); } } else { for (int i = 0; i < pixels; ++i) { nRed = qRed(data[i]); nGreen = qGreen(data[i]); nBlue = qBlue(data[i]); red = nRed + (nRed - 127) * arg1 / 100.0; red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red; green = nGreen + (nGreen - 127) * arg1 / 100.0; green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green; blue = nBlue + (nBlue - 127) * arg1 / 100.0; blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue; data[i] = qRgba(red, green, blue, qAlpha(data[i])); } } return Img; }
3.重写wheelEvent(QWheelEvent *event) 链接Ctrl+滚轮写自己的自定义事件
event->angleDelta().y():用于检测鼠标滚轮滚动方向
QWheelEvent的angleDelta()函数返回一个QPoint对象,表示滚轮的滚动量和方向。
检查y轴的方向,y值大于0,表示滚轮向前滚动,y值小于0,表示滚轮向后滚动。
void PhotoViewer::wheelEvent(QWheelEvent *event) { if (QApplication::keyboardModifiers() == Qt::ControlModifier) { if (event->angleDelta().y() > 0) { zoomInTriggered(); } else { zoomOutTriggered(); } } }
源码下载地址:https://download.csdn.net/download/W18336132494/90277360
原文链接:QT-相册浏览器 (练习自用)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理