读取本地图片后拼接失真问题

 读取本地图片后,保存为jpg格式,图片大小失真,每张本地图片4M,16张图片拼接后只有2M大小,后找到原因,图片保存格式改为bmp格式即可;

找个大半天的原因,原来在此,特此记录!

BMP是Windows操作系统中的标准图像文件格式,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此BMP文件所占用的空间很大。

JPEG是最常用的图像文件格式,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。

简单来说二者的区别有以下几点:

1、图像文件大小不同

BMP不采用其他任何压缩,因此BMP文件所占用的空间很大;JPEG具有调节图像质量的功能,允许用不同的压缩比例对这种文件压缩。

2、图像文件格式不同、后缀名不同

BMP是Bitmap的缩写,后缀名是BMP;JPG又称为JPEG,文件后辍名为".jpg"或".jpeg"。

3、应用广度不同

BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

相比BMP,JPG应用也非常广泛,目前各类浏览器均支JPG这种图像格式,因此jpg是最受欢迎的图像格式。


链接:https://www.zhihu.com/question/584484660/answer/2902451754

//照片旋转并拼接-传本地图片文件夹路径
void MainWindow::image_rotationAndsplicing(QString fullpath)
{
    QString strDirpath = QString(QStringLiteral("F:/work"));
    QDir dir(strDirpath);
    QFileInfoList Info_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    QListIterator<QFileInfo> Iterator(Info_list);
    QStringList iamgeNameList;
    QFileInfo Info;

    while (Iterator.hasNext())
    {
        Info = Iterator.next();
        if (Info.isFile())
        {
            iamgeNameList << QDir(Info.absoluteFilePath()).dirName();
            qDebug()<<QDir(Info.absoluteFilePath()).dirName();
        }
    }

    //按照图片名称后数字排序
    std::sort(iamgeNameList.begin(), iamgeNameList.end(), [](const QString& s1, const QString& s2){
        return s1.split(".")[0].split(QStringLiteral("到"))[1].toInt() < s2.split(".")[0].split(QStringLiteral("到"))[1].toInt();
    });

    QImage baseImage(strDirpath+"/"+iamgeNameList[0]);
    QImage imageWithOverlay = QImage(baseImage.size().width(),
                                     baseImage.size().height()*iamgeNameList.size(), //输出的图片按照第一张图片的i倍高
                                     QImage::Format_ARGB32);
    QPainter painter(&imageWithOverlay);
//    painter.setCompositionMode(QPainter::CompositionMode_Source);
//    painter.fillRect(imageWithOverlay.rect(), Qt::transparent);



    int temp = 999;
    for (int i = 0; i < iamgeNameList.size(); ++i) {
        temp = iamgeNameList[i].split(".")[0].split(QStringLiteral("到"))[1].toInt();
        qDebug()<<"temp:"<<temp;
        QImage baseImage2(strDirpath+"/"+iamgeNameList[i]);
        baseImage2 = baseImage2.scaled(baseImage2.width(),baseImage2.height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
//        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
//        painter.drawImage(0, baseImage.size().height()*i, baseImage2);
        painter.drawImage(0,baseImage.size().height()*i,baseImage2);
    }
    painter.end();
    QMatrix matrix;
    matrix.rotate(-90.0);//逆时针旋转90°
    imageWithOverlay = imageWithOverlay.transformed(matrix, Qt::SmoothTransformation);
    QDir pinjiedir(strDirpath+"/pinjie");
    if (!pinjiedir.exists()) pinjiedir.mkpath(strDirpath+"/pinjie");
    imageWithOverlay.save(strDirpath+"/pinjie/pinjie4.bmp");
}

要同时读取四个摄像头并简单拼接成一幅图像显示,你可以使用OpenCV库来实现。下面是一个示例代码,展示了如何读取四个摄像头的视频流,并将它们简单拼接成一幅图像显示出来: ```python import cv2 # 摄像头索引 camera_indices = [0, 1, 2, 3] # 创建摄像头对象 cameras = [cv2.VideoCapture(index) for index in camera_indices] # 设置摄像头分辨率(可选) for camera in cameras: camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640) camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: # 读取每个摄像头的视频帧 frames = [camera.read()[1] for camera in cameras] # 拼接图像 top_row = cv2.hconcat([frames[0], frames[1]]) bottom_row = cv2.hconcat([frames[2], frames[3]]) combined_frame = cv2.vconcat([top_row, bottom_row]) # 显示拼接后的图像 cv2.imshow("Combined Frame", combined_frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源 for camera in cameras: camera.release() cv2.destroyAllWindows() ``` 在上面的示例中,我们使用`cv2.VideoCapture()`创建了四个摄像头对象,并通过循环读取每个摄像头的视频帧。然后,我们使用`cv2.hconcat()`和`cv2.vconcat()`函数将四个摄像头的视频帧进行拼接,然后在窗口中显示拼接后的图像。 请注意,这只是一个简单的拼接示例,假设四个摄像头的分辨率相同。如果四个摄像头的分辨率不同,你可能需要进行一些调整来确保拼接后的图像不失真。另外,你还可以根据自己的需求对拼接后的图像进行进一步处理或调整。 确保你已经正确安装了OpenCV库,并根据需要修改代码中的摄像头索引、分辨率等参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值