做远程视频监控项目,接触较多图片处理方面问题,作为学习做以下记录:

一、截图默认bmp格式转jpg压缩。

采用jpglib库去实现。

二、jpg图片接收后MFC显示(四种方式)

MFC提供的CWnd只有默认加载BMP文件的接口,对JPG等图像是不支持的,而实际中经常需要用到非BMP的图片,在VC中加载.JPG格式的图片,有四种方法。

第一种:用流对象加载。

IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;

CString m_filename("D:\\009.jpg");//文件名

CFile m_file(m_filename,CFile::modeRead );

//获取文件长度
DWORD m_filelen = m_file.GetLength();

//在堆上分配空间
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata = NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata = GlobalLock(m_hglobal);

//将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream*  m_stream;

GlobalUnlock(m_hglobal);

//在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);

//利用流加载图像
OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture);

m_picture->get_Width(&m_width);
m_picture->get_Height(&m_height);

CDC* dc = GetDC();

m_IsShow = TRUE;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());

m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);

以上代码是用创建流文件的方式加载,也可以加载.gif图片,但不能显示动画效果。

第两种:用IPicture接口的方式实现加载jpg图片

下面的代码则是用IPicture接口的方式来加载jpg图片(全屏显示图片)。
IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;

CString m_filename("D:\\009.jpg");//文件名

CFile m_file(m_filename,CFile::modeRead );

//获取文件长度
DWORD m_filelen = m_file.GetLength();

//在堆上分配空间
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata = NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata = GlobalLock(m_hglobal);

//将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream* m_stream;

GlobalUnlock(m_hglobal);

//在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);

//利用流加载图像
OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture);

m_picture->get_Width(&m_width);
m_picture->get_Height(&m_height);

CDC* dc = GetDC();

m_IsShow = TRUE;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());

m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);

以上代码是用创建流文件的方式加载,也可以加载.gif图片,但不能显示动画效果。
下面的代码则是用IPicture接口的方式来加载jpg图片(全屏显示图片)。
注意:这两段代码不能用在wince平台上,在wince上加载有另外的函数。

CString szFileName;
szFileName.Empty();
szFileName = "D:\\84.jpg";

IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;

if (file.Open(szFileName,CFile::modeRead) && file.GetStatus(szFileName,fstatus) && ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOID pvData =NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
}

}

CComQIPtr<IPicture> m_picture;
HRESULT hr = OleLoadPicture(pStm,0,false,IID_IPicture,(void**)&m_picture);
long a,b;
m_picture->get_Width(&a);
m_picture->get_Height(&b);
CSize sz(a,b);
CDC *pdc = GetDlgItem(IDC_STATIC)->GetDC();
// CDC *pdc = GetDC();
// pdc->HIMETRICtoDP(&sz);
CRect rect;
GetClientRect(rect);
// GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
m_picture->Render(*pdc,rect.left,rect.top,rect.Width(),
rect.Height(),0,b,a,-b,&rect);

第三种:也可以用GDI+把图片转成.bmp文件再加载,

1.在StdAfx.h中静态调用gdiplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下: 
#ifndef   ULONG_PTR 
#define   ULONG_PTR   unsigned   long* 
#include   "GdiPlus.h" 
using   namespace   Gdiplus; 
#pragma   comment(lib,   "gdiplus.lib") 
#endif

2、在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。 
GdiplusStartupInput   m_gdiplusStartupInput;   
ULONG_PTR   m_gdiplusToken;

3、在初始化函数中,初始化GDI+。如:在OnCreate()函数中加入初始化GDI+的函数: 
GdiplusStartup(&m_gdiplusToken,   &m_gdiplusStartupInput,   NULL);

4、对应的在OnDestroy()函数中加入结束GDI+使用的函数:   
GdiplusShutdown(m_gdiplusToken);

接着,就可以使用GDI+了,要实现要求的内容很容易,方法如下: 
写一个如下的方法: 
HBITMAP   ReturnHBITMAP(CString   FileName)//FileName可能是bmp、dib、png、gif、jpeg/jpg、tiff、emf等文件的文件名

          Bitmap   tempBmp(FileName.AllocSysString())   ; 
        Color       backColor;       
        HBITMAP       HBitmap;   
        tempBmp.GetHBITMAP(backColor,&HBitmap); 
        return   HBitmap;

}

5.显示

CWnd *pWnd;

pWnd = GetDlgItem(IDC_DISPLAY_WINDOW_STATIC);

CDC *pDC = pWnd->GetDC():

HDC hDC = pDC->m_hDC;

HDC memDC = CreateCompatibleDC(hDC);

SelectObject(memDC, hBitMap):

BitBlt(hDC, 0, 0,  1440, 900, memDC, 0, 0, SRCCOPY);

DeleteObject(hBitMap);

DeleteDC(memDC);

第四种方式:CImage

CWnd* pWnd;
pWnd=GetDlgItem(IDC_IMAGE1);
CDC* pDC=pWnd->GetDC();
HDC hDC = pDC->m_hDC;

CRect rect_frame;
CImage image;
pWnd->GetClientRect(&rect_frame);
image.Load(fileName);

::SetStretchBltMode(hDC,HALFTONE);
::SetBrushOrgEx(hDC,0,0,NULL);

image.Draw(hDC,rect_frame);
ReleaseDC(pDC);//释放picture控件的DC

在MFC窗口测试前面两种在固定大小窗口显示图片失真严重(在jpg指定1440*900窗口显示正常),第三种显示清晰度可以但是显示图片不全。

第四种方式显示正常。

MFC关于JPG图片显示处理的几个方式相关推荐

  1. 模式识别第二课 建立MFC窗口+插入图片+处理+显示图片

    vs2010 + OpenCV2.4.11 上的模式识别第二课,老师建了一个MFC程序,插入图片,处理,显示图片.这只是一种技术,很容易模仿,难学的是如何对图片处理.数字信号处理课程要学好. 1.新建 ...

  2. MFC——选择图片显示到Picture Control

    出处:http://www.cnblogs.com/Forever-Road/p/6800838.html?utm_source=itdadao&utm_medium=referral MFC ...

  3. MFC编程之图片空间

    按照惯例,在这里直接先上图. 图片控件介绍 所谓的图片空间,就是可以利用它插入图片显示,与静态文本控件有相似之处,都属于CStatic类.成员函数也一样. 那它是如何加载图片的呢? 加载图片可以分为静 ...

  4. 4.1 ucGUI 图片显示方法

    图片显示步骤 1.运行uC-GUI-BitmapConvert.exe,打开图片file->open. 该文件在ucgui3.98\Micrium\Software\uC-GUI\Tool 目录 ...

  5. JS控制图片显示的大小(图片等比例缩放)

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. labview实现简单的图片显示

    labview实现简单的图片显示 标签(空格分隔): labview 笔记 图片处理 按说这并不是什么复杂的问题,但鉴于网上除了官方的帮助外很少有资料,而且我认为又是入门的非常好的例子,故按自己的学习 ...

  7. 安卓constraintLayout中app:srcCompat设置的图片显示不出来

    使用 app:srcCompat 的时候 引入的图片显示不出来的解决方案 首先查看的你的Activity 继承的是那个Activity 如果是继承AppcompatActivity  使用 Image ...

  8. Facebook iOS 应用是如何加速图片显示的?

    本文讲的是Facebook iOS 应用是如何加速图片显示的?, 你的Facebook的动态消息中充满着一些关于你朋友.家人以及你所爱的人的照片,也许你会想要在手机上也能重温那些场景.我们一直在寻找提 ...

  9. 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛图片显示软件发布及线上赛注意事项

    简 介: 本文对于第十六届全国大学生智能车竞赛视觉AI组线上比赛的识别任务软件以及相关比赛流程注意事项进行总结. 关键词: 智能车竞赛,视觉AI组 §01 积分分值   根据 第十六届全国大学生智能车 ...

最新文章

  1. 闭包的介绍、构成条件、作用及示例代码
  2. 029# Adempiere采购模组-从采购申请创建采购订单
  3. java网络编程(六)
  4. 键盘定位板图纸_聊聊机械键盘的结构
  5. 调用AutoCAD的内置对话框
  6. 音视频同步(播放)原理
  7. 代码自动生成工具的补充
  8. 语音助手的涅槃关头,我们应该完全抛弃屏幕还是选择“语音+图形界面”?
  9. eas bos编码规则
  10. 基于RFID定位技术的酒店资产管理--RFID资产管理--新导智能
  11. GitHub Universe 2019 Keynote 回顾
  12. 高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM
  13. 中国人的智商全球最高
  14. 柏力纪德:网店开店之后怎么运营
  15. 图片转文字怎么转?这些方法我只告诉你
  16. IT运维服务外包管理的两种模式
  17. vue js获取手机系统型号、版本、浏览器类型
  18. 【ArcGIS|空间分析】空间分析准备流程
  19. 干货!基于层次适应的零样本学习
  20. 数字0-9的数量 (数位dp ,技巧)

热门文章

  1. 室内空气流动原理图_新风系统的工作原理是什么 新风系统各部件的用途
  2. 全文检索技术_中药图片拍照识别系统,爬虫、深度学习技术android app 源码分享...
  3. JAVA复习5(集合——HashSet)
  4. c语言标识符的词法形式,C语言词法器实验.doc
  5. python内建函数是什么意思_Python3内建函数简介,Python3内建函数详解
  6. 12v60ah锂电池组装图_什么是自放电?如何缩短锂电池自放电测试时间?
  7. 程序员算事业单位吗_清北毕业出来的程序员不如三本公务员?网友:你开心就好...
  8. 送30块树莓派PICO 开发板!
  9. 从大学生到职场人,一段深刻的思维认知升级补丁
  10. 惠普战66怎么用u盘进入系统_惠普笔记本怎么用u盘启动装系统,空间也要大所以超来超受欢迎!...