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-相册浏览器 (练习自用)

posted @   rainbow70626  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示