[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;

}

}