WINCE下使用OPENGL(2)
[cpp]view plaincopy
/********************************************************************
filename:CImgLoader.cpp
created:2011-01-05
author:firehood
purpose:文件加载类,将外部图片资源转化成绘制纹理时所需的位图数据
图片格式支持bmp、png、jpg.
*********************************************************************/
#include"StdAfx.h"
#include"ImgLoader.h"
//IImageIncluder
#include<imaging.h>
#include<initguid.h>
#include<imgguids.h>
//IImagelib
#pragmacomment(lib,"Imaging.lib")
CImgLoader::CImgLoader(void)
{
m_pImage=NULL;
m_Width=0;
m_Height=0;
}
CImgLoader::~CImgLoader(void)
{
}
//加载图片资源
BOOLCImgLoader::Load(LPCTSTRlpFileName)
{
IImagingFactory*pImgFactory=NULL;
IImage*pImage=NULL;
IBitmapImage*pBmpImg=NULL;
//
CoInitializeEx(NULL,COINIT_MULTITHREADED);
if(!SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImgFactory)))
returnFALSE;
if(!SUCCEEDED(pImgFactory->CreateImageFromFile(lpFileName,&pImage)))
returnFALSE;
//获取图像大小信息
ImageInfoImgInfo;
pImage->GetImageInfo(&ImgInfo);
m_Width=ImgInfo.Width;
m_Height=ImgInfo.Height;
if(FAILED(pImgFactory->CreateBitmapFromImage(
pImage,m_Width,m_Height,PixelFormat24bppRGB,
InterpolationHintDefault,&pBmpImg)))
{
returnFALSE;
}
RECTrect={0,0,m_Width,m_Height};
BitmapData*BmpData=newBitmapData;
if(FAILED(pBmpImg->LockBits(&rect,
ImageLockModeRead|ImageLockModeWrite,
PixelFormat24bppRGB,BmpData)))
{
returnFALSE;
}
intline=BmpData->Stride;
LPBYTElpData,lpLine,lpCurPixel;
lpData=lpLine=(LPBYTE)BmpData->Scan0;//获取BMP位图实际值的地址指针
//若为Bottom-Up(从下到上)的位图,则指向buffer的结尾
//若为Top-Down(从上到下)的位图,则指向buffer的开头
//intnBytesPP=nBPP>>3;//左移三位即除以8,获取图像每像素字节数
m_pImage=newunsignedchar[m_Width*m_Height*3];
memset(m_pImage,0,m_Width*m_Height*3);
if(m_pImage==NULL)
returnFALSE;
if(line>0)
{
intpos=m_Width*m_Height*3-1;
for(inti=0;i<m_Height;i++)//行
{
lpLine=lpData+i*line;//获取图像每一行地址指针
for(intj=m_Width-1;j>-1;j--)//列
{
lpCurPixel=lpLine+j*3;//获取每行每像素地址指针
m_pImage[pos--]=*lpCurPixel;//R
m_pImage[pos--]=*(lpCurPixel+1);//G
m_pImage[pos--]=*(lpCurPixel+2);//B
}
}
}
else
{
intpos=0;
for(inti=m_Height-1;i>-1;i--)//行
{
lpLine=lpData+i*line;//获取图像每一行地址指针
for(intj=0;j<m_Width;j++)//列
{
lpCurPixel=lpLine+j*3;//获取每行每像素地址指针
m_pImage[pos++]=*(lpCurPixel+2);//R
m_pImage[pos++]=*(lpCurPixel+1);//G
m_pImage[pos++]=*lpCurPixel;//B
}
}
}
if(FAILED(pBmpImg->UnlockBits(BmpData)))
{
returnFALSE;
}
deleteBmpData;
pBmpImg=NULL;
pImage->Release();
pImgFactory->Release();
returnTRUE;
}
//获取图片数据
unsignedchar*CImgLoader::GetBmpImage(void)
{
returnm_pImage;
}
//获取图像宽度
intCImgLoader::Width()
{
returnm_Width;
}
//获取图像高度
intCImgLoader::Height()
{
returnm_Height;
}
//释放图片资源
voidCImgLoader::Free()
{
if(m_pImage)
{
delete[]m_pImage;
m_pImage=NULL;
}
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。