MFC关于JPG图片显示处理方面记录
来源:互联网 发布:中国崩溃论 知乎 编辑:程序博客网 时间:2024/06/11 01:54
最近在做远程视频监控项目,接触较多图片处理方面问题,作为学习做以下记录:
一、截图默认bmp格式转jpg压缩。
采用jpglib库去实现。
二、jpg图片接收后MFC显示(四种方式)
MFC提供的CWnd只有默认加载BMP文件的接口,对JPG等图像是不支持的,而实际中经常需要用到非BMP的图片,在VC中加载.JPG格式的图片,有四种方法。
第一种:用流对象加载。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
以上代码是用创建流文件的方式加载,也可以加载.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图片显示处理方面记录
- MFC显示jpg图片
- MFC显示JPG图片
- MFC显示JPG图片
- MFC读取jpg图片显示
- MFC种显示jpg图片
- MFC中JPG图片显示
- MFC显示JPG、JIF图片
- MFC显示jpg图片到控件
- MFC对话框中显示BMP,JPG图片
- MFC处理jpg格式图片(三)
- 关于WINCE下JPG图片的显示
- MFC加载JPG图片
- MFC 加载jpg图片
- 如何在MFC窗口显示BMP和JPG图片
- 如何在MFC窗口显示BMP和JPG图片
- 如何在MFC窗口显示BMP和JPG图片
- MFC用Picture control显示jpg等各种图片
- Linux中IIC设备驱动再细读
- Oracl提示“记录被另一个用户锁住” 解决方法
- Dubbo 消费者启动流程
- 开发笔记---软键盘遮挡输入框和导航栏遮挡了内容的解决方案
- 欢迎使用CSDN-markdown编辑器
- MFC关于JPG图片显示处理方面记录
- Angualr中的ng-class
- 算法提高 不同单词个数统计
- DSO示波器的带宽和采样率
- javascript===和==,xml中<></>和</>区别
- javascript中的var,let和const
- 用正则表达式匹配电话号码
- C# 线程中更新界面控件
- 《算法新解》作者刘新宇:我只是想打开那些黑盒子,告诉人们里面有什么。