本人是以Qt开发的,奈何数据太大8192*12384字节的数据,直接128Mb,导致QImage生成实例化对象时,老是弹出out memory的输出信息,显示通过分开画图再组合的方式实现了,本想存储直接上opecv,师兄说没必要,而且opcv的64位我是真编译不出来它的动态库。
幸好在网上直接发现了一个大佬造好的轮子,按照大佬给的例子,写了一下,将128Mb数据的文件,存成34.3Mb的文件。下面介绍一下用法喽。
其实就是一个函数
bool writeJpeg(WRITE_ONE_BYTE output, const void* pixels_, unsigned short width,
unsigned short height,bool isRGB, unsigned char quality_, bool downsample,
const char* comment)
WRITE_ONE_BYTE output // 一个回调函数指针,用来在该函数里写入数据
const void* pixels_ //内存数据
unsigned short width //图像宽
unsigned short height //图像高
bool isRGB //true为RGB格式 false 为灰度格式
unsigned char quality_ //YCbCr444 JPEG (高质量), YCbCr420 (低质量)
const char* comment // 属性评论
应用
QByteArray imgData;
unchar * u_imgDate = reinterpret_cast<uchar*>imgData.data();
QFile save_file("1.jpg");
save_file.open(QIODevice::WriteOnly)
static QDataStream out(&save_file);
TooJpeg::writeJpeg([](unsigned char byte)
{out << byte;},u_imgData,8192,16384,false,80,false,"TooJpeg example image");
save_file.close();
我在上面实现了一个lambda表达式,不知道为什么无法将外部的局部参数传入,只能通过这种静态方式,实现值传递。要记得关闭文件,不然文件保存会有问题。这个函数的CPP文件以及头文件,给大家https://create.stephan-brumme.com/toojpeg/。原文中博主给出了cpp以及头文件下载地址,并且提供了 c++的实现方式,我这里是用Qt实现的。
存储最终结果。