QImage 图片分割、保存

简介

之前一直只用Qt做图片显示,这次突发奇想想用Qt做做图像相关的,就尝试了一下图片切割,保存。

QImage介绍

QImage类为Qt提供的一个支持图像算法处理的类库,可以精确到像素及单位。在我理解不是提供了什么算法,而是为图像计算提供了基础。

构造函数

QImage()
QImage(const QSize &size, QImage::Format format)
QImage(int width, int height, QImage::Format format)
QImage(uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(uchar *data, int width, int height, int bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(const uchar *data, int width, int height, int bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(const char *const [] xpm)
QImage(const QString &fileName, const char *format = nullptr)
QImage(const QImage &image)
QImage(QImage &&other)

提供了以上构造方法,支持 uchar* ,const uchar*,filename 等元素的构造。

Format

Format Description Qt’s support
BMP Windows Bitmap Read/write
GIF Graphic Interchange Format (optional) Read
JPG Joint Photographic Experts Group Read/write
JPEG Joint Photographic Experts Group Read/write
PNG Portable Network Graphics Read/write
PBM Portable Bitmap Read
PGM Portable Graymap Read
PPM Portable Pixmap Read/write
XBM X11 Bitmap Read/write
XPM X11 Pixmap Read/write

QImage 支持的图片格式如上表所示,部分支持读写特性。

相关方法:

QImage::Format format() const
QImage convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
QImage convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
QImage convertToFormat(QImage::Format format, const QVector<QRgb> &colorTable, Qt::ImageConversionFlags flags = Qt::AutoColor) const

图像操作:像素、RGB、位深度、color、size

图像载入:

bool load(const QString &fileName, const char *format = nullptr)
bool load(QIODevice *device, const char *format)
bool loadFromData(const uchar *data, int len, const char *format = nullptr)
bool loadFromData(const QByteArray &data, const char *format = nullptr)

图像数据:

uchar *bits()
const uchar *bits() const
int bytesPerLine() const
const uchar *constBits() const
const uchar *constScanLine(int i) const

RGB:

QRgb color(int i) const
QVector<QRgb> colorTable() const
QRgb pixel(const QPoint &position) const
QRgb pixel(int x, int y) const

思路介绍

图像切割思路如下:

1.载入图片
2.切割图片
->2.1 设置切割属性:将图片切割为 n*m 个图片
->2.2 计算每个图片的rect,保存为rect列表
->2.3 利用copy(Rect)函数将指定区域图片copy出来,存储到切割列表中
3.显示图片
-> 按照rect列表显示切割后的图片
4.保存图片
-> 将切割后的图片存储到指定位置

程序部分

类图

主要由三个类组成:Image类,负责图像操作部分。MainWindow,主线调度类,负责功能性调度,或者说逻辑模块,业务部分。splite类。图片剪切设置框



Image类

image.cpp
image.h
image.ui
class image : public QWidget
{Q_OBJECTpublic:explicit image(QWidget *parent = nullptr);~image();//图片载入void imageLoad(const QString path);void imageLoad(const QString path, int &_width, int &_height);uchar* imageData();//图像切割void iamgeItems(int x, int y, QList<QImage> &imageList);void iamgeItems(int x, int y, QList<uchar*> &list);//uchar* 方便像素级的图像算法或者其他图像操作void iamgeItems(int x, int y, QVector<uchar*> & vector);//图像保存void imageSave();void imageSave(int index);void imageSave(int start,int end);//图像显示void imageShow();void imageShow(QList<QImage> &listImage);void imageShow(QList<uchar*> &listItems);void imageShow(QVector<uchar*> &VectorItems);static image* instance();
private:Ui::image *ui;QImage r_image;uchar * r_image_data;QList<QRect> _imageRects;QList<QImage> _imageList;QList<uchar*> _listItems;QVector<uchar*> _vectorItems;
};

图像载入

//利用load方法载入图像
void image::imageLoad(const QString path)
{r_image.load(path);
}void image::imageLoad(const QString path, int &_width, int &_height)
{r_image.load(path);_width = r_image.width();_height = r_image.height();
}

图像切割

void image::iamgeItems(int x, int y, QList<QImage> &imageList)
{int r_width = r_image.width();int r_height =  r_image.height();int cellWidth = r_width / x;int cellHeight = r_height / y;qDebug() << r_width << " " <<  r_height << " " << cellWidth << " " << cellHeight;for(int i = 0 ;i < x; i++ ){for (int j = 0; j < y; j++) {QRect rect(i * cellWidth,j * cellHeight, cellWidth,cellHeight);qDebug() << rect.x() << " " <<  rect.y() << " " << rect.width() << " " << rect.height();_imageRects.push_back(rect);imageList.push_back(r_image.copy(rect));}}_imageList = imageList;
}

图像保存

void image::imageSave()
{int i = 0;for(auto it : _imageList){QString imageName = QString("image/%1.jpg").arg(i);it.save(imageName);i++;}qDebug() << "iamge save ok";
}void image::imageSave(int index)
{_imageList.at(index).save(QString("image/%1.jpg").arg(index));
}

图像显示

void image::imageShow()
{for(int i = 0 ;i < _imageList.size() ; i++){QLabel * label = new QLabel(this);label->setGeometry(_imageRects.at(i));QPixmap pixmap(QPixmap::fromImage(_imageList.at(i)));label->setPixmap(pixmap);label->show();}
}

MainWindow

负责全部的业务逻辑部分,也就是通俗所说的调度。

mainwindow.cpp
mainwindow.h
mainwindow.ui
class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();void menuInit();
private:Ui::MainWindow *ui;void sltImportImage();void sltSpliteImage();void sltSaveImage();void sltcalcImage();
};

菜单初始化

void MainWindow::menuInit()
{QAction* importImage = ui->menuBar->addAction(QString("导入图片"));QAction* spliteImage = ui->menuBar->addAction(QString("切割图片"));QAction* saveImage = ui->menuBar->addAction(QString("保存图片"));QAction* calcImage = ui->menuBar->addAction(QString("算法"));connect(importImage,&QAction::triggered,this,&MainWindow::sltImportImage);connect(spliteImage,&QAction::triggered,this,&MainWindow::sltSpliteImage);connect(saveImage,&QAction::triggered,this,&MainWindow::sltSaveImage);connect(calcImage,&QAction::triggered,this,&MainWindow::sltcalcImage);
}

导入图片

void MainWindow::sltImportImage()
{QString imagePath = QFileDialog::getOpenFileName(this,"导入图片","./","*png *jpg");int imageWidth = 0,imageHeight = 0;ui->iamge->imageLoad(imagePath,imageWidth,imageHeight);ui->iamge->imageData();this->resize(imageWidth,imageHeight);
}

图片切割

void MainWindow::sltSpliteImage()
{splite *_splite = new splite();_splite->show();connect(_splite,&splite::sign_spliteinfo,[=](int x,int y){QList<QImage> imageItems;ui->iamge->iamgeItems(x,y,imageItems);ui->iamge->imageShow();});
}

图像保存

void MainWindow::sltSaveImage()
{ui->iamge->imageSave();
}

图像算法选择

void MainWindow::sltcalcImage()
{//设计中选择图像算法,注册对应图像算法,选择实现对应的图像算法//算法模块中,特意提供了将图像数据列表,方便算法操作。//近期会找一两个比较简单的图像算法来实现
}

其他函数说明

主函数

int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

splite构造函数

splite::splite(QWidget *parent) :QWidget(parent),ui(new Ui::splite)
{ui->setupUi(this);connect(ui->pushButton_right,&QPushButton::clicked,[=](){emit sign_spliteinfo(ui->lineEdit_x->text().toInt(),ui->lineEdit_y->text().toInt());this->close();});connect(ui->pushButton_cancel,&QPushButton::clicked,[=](){this->close();});
}

运行效果

主程序界面

图像载入

图像切割

图像保存

源码

Gitee

QImage 图片分割、保存相关推荐

  1. php 在图片分割,图片分割用什么软件 图片平均分割八份并分别保存|图片平均分割软件...

    (。・∀・)ノ゙昨天有个童鞋问小编图片分割用什么软件,可以将图片平均分割八份并分别保存的那种,今日灵犀一闪,就弄出了这篇图片平均分割软件,详细操作且看下文.狸窝家园也分享有一个集合近百个图片处理软件为 ...

  2. Unity 图片分割将spirte保存在本地

    如果你拿到的是一张整图,你想分割之后使用NGUI sprite来使用!  下面就能解决的需求. 步骤: 1. 使用Unity自带的spirte进行分割图片 2. 使用代码把分割出来的2DSpirte转 ...

  3. python测试脚本截图_Python+selenium实现截图图片并保存截取的图片

    这篇文章介绍如何利用Selenium的方法进行截图,在测试过程中,是有必要截图,特别是遇到错误的时候进行截图.在selenium for Python中主要有三个截图方法,我们挑选其中最常用的一种. ...

  4. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧

    [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧 原文:[开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧 不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享 ...

  5. html中如何把一张图片分块,神奇图片分割软件有哪些分割模式 图片分割器如何检验能否无缝拼图...

    神奇图片分割软件如何使用?神奇图片分割软件分割图片有哪些模式?神奇图片分割软件自带的批量分割功能在哪?神奇图片分割软件如何无缝拼接已经分割的图片?神奇图片分割软件是一款非常好用的图片分割器,可以按尺寸 ...

  6. 【python基础系列】实现图片分割

     [python脚本系列]实现图片分割           大家好,我是Lampard猿奋~~       欢迎来到python脚本系列的博客       大家可能会遇到秀恩爱发朋友圈,没有9图强行凑 ...

  7. python-使用PIL工具包将图片分割成四等分再还原

    今天随便分享一个,图片批量分割的代码,把图片分割成四等份,多用于扩增数据集用, 也可以再还原回去. 代码如下: from PIL import Imagedir = './1111.jpg' #当前图 ...

  8. 朋友圈九宫格照片怎么做?一键图片分割

    相信朋友们都看过这样发朋友圈的方式,一张图片发出九宫格的效果: 或者是在各大社交平台.引流平台,这种发图的方法已经屡见不鲜了,可当自己上网搜[图片分割].[宫格切图]等等,要么就是要注册账号登录才能操 ...

  9. linux图片分割工具,神奇图片分割软件下载

    神奇图片分割软件是一款功能强大.简单方便的图片分割软件,该软件专门为图片分割而量身打造,能够快速精确的将图片分割成很多个图像文件,该软件支持市面上所有主流的文件格式,用户可以随意选择需要的图片文件格式 ...

最新文章

  1. 使用pgpool-ii建立PostgreSQL链接池
  2. 如何仅从git存储库中稀疏签出单个文件?
  3. 《剑指offer》c++版本 5.替换空格
  4. Vector找最大值 最小值
  5. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  6. 事务,视图及索引!!!
  7. 原生js的ajax请求
  8. 【十大经典数据挖掘算法】PageRank
  9. 如何在Go中实现Elasticsearch
  10. 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
  11. linux启动参数怎么传给内核,如何启动内核(vivi与Linux kernel的参数传递情景分析)...
  12. Java API 中文版 谷歌翻译 拿走不谢 jdk api 1.8_google
  13. 2021年中国工业机器视觉行业产业链分析:人工智能时代带动行业发展[图]
  14. python 图片外围置零 np.pad操作
  15. 解决IE上登陆oracle OEM时报:“证书错误,导航已阻止”且无继续浏览的错误
  16. Matlab中持久变量(persistent)在Python中的理解
  17. Python3批量爬取指定微博中的图片
  18. linux dolphin模拟器,Dolphin for Mac(GameCube模拟器)
  19. 《迅雷链精品课》第四课:区块链技术的发展趋势
  20. 三星电子中国研究院招聘CV、NLP、语音/音频工程师和实习生

热门文章

  1. 转战物联网·基础篇01-物联网之我见
  2. 植物大战僵尸资源文件提取 总结
  3. 《Java SE实战指南》09-01:访问级别修饰符概述
  4. Variant类型在各语言中的参数传递
  5. 力扣146题 LRU 缓存机制
  6. 图的最小生成树(Prim算法、Kruskal算法)
  7. 这几个网站的使用技巧,值得反复读,反复练~
  8. 前端工程师用代码制作特效,七夕情人节成功表白女神,终于摆脱单身
  9. 请教switch内部的变量定义问题?
  10. ES(三)es查询语法