C++如何实现二进制数据存储为灰度图

17 篇文章 4 订阅

本人是以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实现的。

存储最终结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值