MFC中基础控件的使用之Picture Control

                                   Picture Control的作用就是显示图片或者显示视频

     在这里我主要通过一个例子:打开任一格式的图片将其显示在控件中   介绍其用法,这里面也顺便介绍了读取图片像素的方法。

     如何在控件中播放视频请看这篇片博文:http://blog.csdn.net/starrain2016/article/details/65660410

一、添加一些必要的文件及环境

配置为:GDI+环境

#include "Dib.h"
#include "atlbase.h"
#include "atlimage.h" 

typedef struct ColorImageMes
{
	RGBQUAD** BYImageData;    //彩色图像像素数据
	double**  DOImageData;
	_In_ int    Height;    //图像高
	_In_ int    Width;     //图像宽
} ColorimageMes;

二、实现

/*******************************************************************************************
* 功能: 打开某文件夹下的任一格式图片并显示在Picture中
*pStaic:方法:(CStatic*)GetDlgItem(IDC)
**:status:finfish
*******************************************************************************************/
ColorImageMes ImageObject::OpenEitherFormatImagePictureShow(CStatic *pStaic)
{
	CString strPath;
	CFileDialog  dlg(TRUE, NULL, NULL, OFN_NOCHANGEDIR, _T("JPEG/BMP/GIF(*.jpg;*.jpeg;*.bmp;*.gif)|*.jpg;*.jpeg;*.bmp;*.gif|"));//加载图片
	int   iReturn = dlg.DoModal();
	if (iReturn == IDOK)
	{
	    int   nCount = 0;
	    strPath = dlg.GetPathName();                  //获取该图片的路径及名称
	    ShowEitherFormatPicture(strPath,pStaic);      //显示
	}
	return GetImagePixel(strPath);                    //获取该图片的像素值
}
/************************************************************************************
加载某路径下的任意格式图片并显示在控件中
*pathfile:为待显示的文件路径
PStaic:方法:(CStatic*)GetDlgItem(IDC)
*:status:finfish
************************************************************************************/
void ImageObject::ShowEitherFormatPicture(CString &pathfile, CStatic *pStaic)
{
	HBITMAP bitmap;
	CRect rect;                                 //获得控件的大小
	pStaic->GetClientRect(&rect);
	int rcWidth = rect.right - rect.left;       //通过控件的坐标计算其大小
	int rcHeight = rect.bottom - rect.top;

	bitmap = LoadALLPIC(pathfile.GetBuffer(0), rcWidth, rcHeight);     //加载图片数据
	pStaic->ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE);                
	pStaic->SetBitmap(bitmap);                                         //显示
}
HBITMAP ImageObject::LoadALLPIC(TCHAR * strFileName, int width, int heigh)//加载图片数据
{
	IPicture* p = NULL;
	IStream* s = NULL;
	HGLOBAL hG;
	void* pp;
	FILE* fp;
	// Read file in memory
	//_wfopen_s(&fp, strFileName, _T("rb"));//Uunicode编码
	fp=fopen(strFileName,_T("rb"));//多字节编码
	if (!fp)
		return NULL;

	fseek(fp, 0, SEEK_END);
	int fs = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	hG = GlobalAlloc(GPTR, fs);
	if (!hG)
	{
		fclose(fp);
		return NULL;
	}
	pp = (void*)hG;
	fread(pp, 1, fs, fp);
	fclose(fp);

	CreateStreamOnHGlobal(hG, false, &s);
	if (!s)
	{
		GlobalFree(hG);
		return NULL;
	}

	OleLoadPicture(s, 0, false, IID_IPicture, (void**)&p);

	if (!p)
	{
		s->Release();
		GlobalFree(hG);
		return NULL;
	}

	s->Release();
	GlobalFree(hG);

	HBITMAP hB = 0;
	p->get_Handle((unsigned int*)&hB);

	HBITMAP hBB = (HBITMAP)CopyImage(hB, IMAGE_BITMAP, width, heigh, LR_COPYRETURNORG);     //拷贝图象信息,并将其缩放成控件大小

	p->Release();
	return hBB;
}
/***********************************************************************************
//读原图的数据
*Strfile: 图像所在的路径
*ImageData:返回的图像像素
*WndWidth:返回图像的宽
*WndHeight:返回图像的高
*:status:finfish
**********************************************************************************/
ColorImageMes ImageObject::GetImagePixel(CString &Strfile)
{
	ColorImageMes Picture;
	USES_CONVERSION; 
	WCHAR* pBuf = T2W((LPCTSTR)Strfile);   //CString 转 WCHAR
	wstring infilename(pBuf);
	string outfilename("color.txt");

	Bitmap* bmp = new Bitmap(infilename.c_str());
	Picture.Height = bmp->GetHeight();
	Picture.Width = bmp->GetWidth();

	Color color;

	Picture.BYImageData = new RGBQUAD*[Picture.Height];

	for (int l = 0; l < Picture.Height; l++)
	{
		Picture.BYImageData[l] = new RGBQUAD[Picture.Width];
	}

	for (int y = 0; y < Picture.Height; y++)
	{
		for (int x = 0; x < Picture.Width; x++)
		{
			bmp->GetPixel(x, y, &color);
			Picture.BYImageData[y][x].rgbGreen = (int)color.GetGreen();
			Picture.BYImageData[y][x].rgbRed = (int)color.GetRed();
			Picture.BYImageData[y][x].rgbBlue = (int)color.GetBlue();
			Picture.BYImageData[y][x].rgbReserved = 0;
		}
	}
	delete bmp;
	return Picture;
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值