无废话,直接上代码

show me the code 头文件

#include <Windows.h>
#include <comdef.h>
#include <gdiplus.h>
#include <map>using namespace std;using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")class DGIWin32Plus
{Bitmap * _bitmap = NULL;//IStream *_stream = NULL;::CLSID _jpgClsid;int _oldw = 320;int _oldh = 240;
protected:int mi_to_memory(Gdiplus::Bitmap *image, void *outbuf, int outbufsize);
public:int   EncodeRGB2Jpeg(char *RGB,int width,int height ,int LineWidth, char *Jpeg, int JpegLen);DGIWin32Plus(void);~DGIWin32Plus(void);};

show me the code cpp文件

#include "DGIWPlus.h"
#include <string.h>
#include <atlconv.h> #define DGIDelete(x) do{if(x!=NULL){delete x;x=NULL;}}while(0)
#define DGIDelete_Array(x) do{if(x!=NULL){ delete[]x;x=NULL;}}while(0)#define DEFINE_GOBJ    Graphics gObj(_Mem)
//#define DEFINE_GOBJHDC Graphics gObjhdc(_Mem)
#define DEFINE_IMG(x) Gdiplus::Bitmap *x;x=NULL#define GET_WIDTH(x) x->GetWidth()
#define GET_HEIGHT(x) x->GetHeight()
#define UNDEFINE_IMG(x) DGIDelete(x)static int GetEncoderClsid( const WCHAR *format, CLSID *pClsid )
{UINT num = 0, size = 0;Gdiplus::ImageCodecInfo *pImageCodecInfo = NULL; Gdiplus::GetImageEncodersSize( &num, &size );if( size == 0 ){return -1;}pImageCodecInfo = (Gdiplus::ImageCodecInfo*) malloc( size );Gdiplus::GetImageEncoders( num, size, pImageCodecInfo );for( UINT i = 0; i < num; ++ i ){if( wcscmp( pImageCodecInfo[i].MimeType, format ) == 0 ){*pClsid = pImageCodecInfo[i].Clsid;free( pImageCodecInfo );return i;}}free( pImageCodecInfo );return -1;
}static bool mem_to_global( const void *buf, size_t size, HGLOBAL global )
{void *dest = ::GlobalLock( global );if( dest == NULL ){return false;}std::memcpy( dest, buf, size );::GlobalUnlock( global );return true;
}static int stream_to_mem( IStream *stream, void *outbuf, int outbufsize )
{ULARGE_INTEGER ulnSize;LARGE_INTEGER lnOffset;lnOffset.QuadPart = 0;/* get the stream size */if( stream->Seek( lnOffset, STREAM_SEEK_END, &ulnSize ) != S_OK ){return -1;}if( stream->Seek( lnOffset, STREAM_SEEK_SET, NULL ) != S_OK ){return -1;}if (ulnSize.QuadPart > outbufsize)ulnSize.QuadPart = outbufsize;/* read it *///*outbuf = malloc( (size_t)ulnSize.QuadPart );//*size = (size_t) ulnSize.QuadPart;ULONG bytesRead;if( stream->Read( outbuf, (ULONG)ulnSize.QuadPart, &bytesRead ) != S_OK ){//free( *outbuf );return -1;}return bytesRead;
}static Gdiplus::Bitmap *mi_from_memory( const void *buf, size_t size )
{IStream *stream = NULL;HGLOBAL global = ::GlobalAlloc( GMEM_MOVEABLE, size );if( global == NULL ){return NULL;}/* copy the buf content to the HGLOBAL */if( !mem_to_global( buf, size, global ) ){::GlobalFree( global );return NULL;}/* get the IStream from the global object */if( ::CreateStreamOnHGlobal( global, TRUE, &stream ) != S_OK ){::GlobalFree( global );return NULL;}/* create the image from the stream */Gdiplus::Bitmap *image = Gdiplus::Bitmap::FromStream( stream );stream->Release();/* i suppose when the reference count for stream is 0, it will GlobalFree automatically. The Image maintain the object also.*/    return image;
}int DGIWin32Plus::mi_to_memory( Gdiplus::Bitmap *image, void *outbuf, int outbufsize )
{IStream *stream = NULL;if (::CreateStreamOnHGlobal(NULL, TRUE, &stream) != S_OK){return -1;}/* save the image to stream */Gdiplus::Status save_s = image->Save( stream, &_jpgClsid );if( save_s != Gdiplus::Ok ){stream->Release();return -1;}/* read the stream to buffer */int ret = stream_to_mem(stream, outbuf, outbufsize);stream->Release();return ret;}static GdiplusStartupInput m_gdiplusStartupInput ;
static ULONG_PTR m_gdiplusToken;
void StartDGIWPlus()
{GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL); }
void EndDGIPlus()
{GdiplusShutdown(m_gdiplusToken);
}DGIWin32Plus::DGIWin32Plus(void)
{StartDGIWPlus();//::CLSID jpgClsid;GetEncoderClsid(L"image/jpeg", &_jpgClsid);
}DGIWin32Plus::~DGIWin32Plus(void)
{if (_bitmap != NULL)delete _bitmap;/*if(_stream !=NULL)_stream->Release();*/EndDGIPlus();
}int   DGIWin32Plus::EncodeRGB2Jpeg(char *RGB,int width,int height ,int lineWidth, char *Jpeg, int JpegLen)
{if (width != _oldw || height != _oldh){_oldw = width;_oldh = height;}if (_bitmap != NULL){delete _bitmap;_bitmap = NULL;}_bitmap = new Bitmap(width, height, lineWidth, PixelFormat24bppRGB, (BYTE*)RGB);if (_bitmap == NULL)return -1;//size_t size;int ret = mi_to_memory(_bitmap, (void*)Jpeg, JpegLen);//delete bitmap;return ret;
}

各位读者直接调用类就行,数据存磁盘就再写个存文件就好

压缩数据成JPG到内存-windows相关推荐

  1. 树莓派linux 容量不足,树莓派内存不足,使用zram来压缩数据增加内存

    内存永远是紧俏的资源,尤其是对于老式的树莓派来说,这篇文章详细记录了如何在Raspberry Pi上使用zram来压缩数据,用时间换空间增加内存. zram是一个Linux内核模块,被设计用来在RAM ...

  2. python降维将多列数据压缩为一列_Python机器学习(Sebastian著 ) 学习笔记——第五章通过降维压缩数据(Windows Spyder Python 3.6)...

    数据压缩是机器学习领域中重要的内容,通过数据压缩技术可以将原始数据集变换到一个维度更低的新的特征子空间,帮助对数据存储和分析. 降维压缩数据,分为无监督和有监督两类,先来介绍无监督数据压缩--主成分分 ...

  3. Python机器学习(Sebastian著 ) 学习笔记——第五章通过降维压缩数据(Windows Spyder Python 3.6)...

    数据压缩是机器学习领域中重要的内容,通过数据压缩技术可以将原始数据集变换到一个维度更低的新的特征子空间,帮助对数据存储和分析. 降维压缩数据,分为无监督和有监督两类,先来介绍无监督数据压缩--主成分分 ...

  4. 封送处理您的数据:利用 COM 和 Windows 2000 的高效传输数据的技术

    From: http://blog.csdn.net/zhoujianhei/article/details/1844319 摘要 您所选择的数据传输方式在分布式应用程序中是非常重要的.Windows ...

  5. 大数据导出Excel导致内存溢出的解决方案

    一.问题描述: 公司之前的项目中客户有一个需求是将业务数据导出到Excel表中,方便他们对账,单个导出任务数据量近100W,每当月初任务量多时,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每个 ...

  6. vc++64位系统下long的长度为4个字节_新来的妹子把几百万数据放入了内存,系统立马爆了...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家 下一篇:这200G的Java实战资料是我师傅当年教 ...

  7. linux compress参数,compress命令_Linux compress 命令用法详解:使用Lempress-Ziv编码压缩数据文件...

    compress命令使用"Lempress-Ziv"编码压缩数据文件.compress是个历史悠久的压缩程序,文件经它压缩后,其名称后面会多出".Z"的扩展名. ...

  8. 堆(概念,数据结构中堆与内存堆区的区别 ,堆的基本操作)

    堆的特性: 必须是完全二叉树 用数组实现 任一结点的值是其子树所有结点的最大值或最小值 最大值时,称为"最大堆",也称大根堆: 在完全二叉树中,任何一个子树的最大值都在这个子树的根 ...

  9. 用DeflateStream和GZipStream压缩数据

    System.IO.Compression 命名空间提供两个类:DeflateStream和GZipStream,这两个类都可以实现数据压缩.这两个类采用都采用Deflate算法来进行无损数据压缩, ...

最新文章

  1. 打破欧美垄断,国防科大斩获“航天界奥林匹克”大赛首冠
  2. Bagging和Boosting 概念及区别
  3. 区块链BaaS云服务(25)边界智能 IRITA服务
  4. 关于intel 32 hex文件格式以及hex2rom.sed
  5. 洛谷 题解 P2010 【回文日期】
  6. 东北大学计算机 大一物理考试题,东北大学大学物理期末考题及答案Word版
  7. Python字符串| isdecimal()方法与示例
  8. minus sql oracle,在T-SQL中实现Oracle的MINUS集合运算符
  9. LinkedList类源码阅读
  10. 下列选项中非法的c语言转义字符,c语言练习题t答案
  11. 《基于Cortex-M4的虚拟机制作与测试》课程设计 结题报告
  12. python求上α分位点_什么是标准正态分布的上α分位点以及怎样求?
  13. 知乎Redis的演进之路:从单机到2000万QPS的挑战
  14. Input上传多个文件
  15. 湿度控制c语言程序,基于51单片机的湿度控制系统设计.doc
  16. 计算机毕业设计 SSM校园拼车系统 拼车出行管理系统 滴滴打车管理系统Java Vue MySQL数据库 远程调试 代码讲解
  17. PHP实战之发送邮件
  18. 联想WIN10解决intel vt-x问题
  19. 英语口语291之每日十句口语
  20. 前端专题 RGB和RGBA( rgb 和 rgba ),及十六进制 颜色介绍

热门文章

  1. 我一直在想500年前我是不是孙悟空,但是事实上我却是至尊宝。这就是宿命(capsicum.heorhome.net)
  2. MFC开发IM-设置 static的背景色和字体色
  3. 支付宝国庆消费报告出炉:景区消费涨9倍
  4. 自动驾驶,不要再杀人了
  5. 月球好忙 蓝色起源2024年要将首位女性送上月球表面
  6. 腾讯未成年保护措施再优化,专治孩子忽悠家长帮过人脸识别
  7. 快来被子里 看看我的夜光收钱码!
  8. 华为高管“泄密”,华为P40 Pro外观定了!
  9. 2019广州车展:国产版特斯拉Model 3正式亮相
  10. 魅族16T刚发布就被锤!德国莱茵TÜV:它没通过我的认证