您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-25 19:03 417 查看
                                   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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ mfc visual studio 控件