日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC关于JPG图片显示处理的几个方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

做遠(yuǎn)程視頻監(jiān)控項(xiàng)目,接觸較多圖片處理方面問題,作為學(xué)習(xí)做以下記錄:

一、截圖默認(rèn)bmp格式轉(zhuǎn)jpg壓縮。

采用jpglib庫(kù)去實(shí)現(xiàn)。

二、jpg圖片接收后MFC顯示(四種方式)

MFC提供的CWnd只有默認(rèn)加載BMP文件的接口,對(duì)JPG等圖像是不支持的,而實(shí)際中經(jīng)常需要用到非BMP的圖片,在VC中加載.JPG格式的圖片,有四種方法。

第一種:用流對(duì)象加載。

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?);

//獲取文件長(zhǎng)度
DWORD?m_filelen?=?m_file.GetLength();?

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

LPVOID?pvdata?=?NULL;
//鎖定堆空間,獲取指向堆空間的指針
pvdata?=?GlobalLock(m_hglobal);

//將文件數(shù)據(jù)讀區(qū)到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream*??m_stream;

GlobalUnlock(m_hglobal);

//在堆中創(chuàng)建流對(duì)象
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);

以上代碼是用創(chuàng)建流文件的方式加載,也可以加載.gif圖片,但不能顯示動(dòng)畫效果。

第兩種:用IPicture接口的方式實(shí)現(xiàn)加載jpg圖片

下面的代碼則是用IPicture接口的方式來(lái)加載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 );

//獲取文件長(zhǎng)度
DWORD m_filelen = m_file.GetLength();?

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

LPVOID pvdata = NULL;
//鎖定堆空間,獲取指向堆空間的指針
pvdata = GlobalLock(m_hglobal);

//將文件數(shù)據(jù)讀區(qū)到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream* m_stream;

GlobalUnlock(m_hglobal);

//在堆中創(chuàng)建流對(duì)象
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);

以上代碼是用創(chuàng)建流文件的方式加載,也可以加載.gif圖片,但不能顯示動(dòng)畫效果。
下面的代碼則是用IPicture接口的方式來(lái)加載jpg圖片(全屏顯示圖片)。
注意:這兩段代碼不能用在wince平臺(tái)上,在wince上加載有另外的函數(shù)。

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+把圖片轉(zhuǎn)成.bmp文件再加載,

1.在StdAfx.h中靜態(tài)調(diào)用gdiplus.lib,即由編譯系統(tǒng)完成對(duì)DLL的加載,應(yīng)用程序結(jié)束時(shí)卸載DLL的編碼。如下:?
#ifndef???ULONG_PTR?
#define???ULONG_PTR???unsigned???long*?
#include???"GdiPlus.h"?
using???namespace???Gdiplus;?
#pragma???comment(lib,???"gdiplus.lib")?
#endif

2、在類的頭文件中定義,以下成員變量,用來(lái)初始化GDI+的使用和結(jié)束使用。?
GdiplusStartupInput???m_gdiplusStartupInput;???
ULONG_PTR???m_gdiplusToken;

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

4、對(duì)應(yīng)的在OnDestroy()函數(shù)中加入結(jié)束GDI+使用的函數(shù):???
GdiplusShutdown(m_gdiplusToken);

接著,就可以使用GDI+了,要實(shí)現(xiàn)要求的內(nèi)容很容易,方法如下:?
寫一個(gè)如下的方法:?
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窗口測(cè)試前面兩種在固定大小窗口顯示圖片失真嚴(yán)重(在jpg指定1440*900窗口顯示正常),第三種顯示清晰度可以但是顯示圖片不全。

第四種方式顯示正常。
?

總結(jié)

以上是生活随笔為你收集整理的MFC关于JPG图片显示处理的几个方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。