在程序中,很多使用GDI+,很多要操作图片文件的地方。当然我们有Bitmap 类,有Bitmap::FromFile 函数,只需要指定文件路径,后面的一切都那么轻松!
但是,当你载入图片后,你的程序就拿到了此图片文件的权限了,你要再在系统中去操作该图片(如重命名)的时候,则会出现访问受限的警告的!你只能结束你的程序才可以!
我在这里的办法则是把图片文件直接读到内存中去,然后释放文件权限,后面的操作就和文件无关了!此处也还是用到了Bitmap中的另外一个方法 Bitmap::FromStream ,
由于此方法操作起来不是很方便,所以我在之前是很少用它的,但是在这个时候,用它来处理是很理想的。
使用 Bitmap::FromStream 流处理的时候,要用到另外一个东西 HGLOBAL,在这里只提一下,这不是我们的重点(能力也有限,也讲不清楚,只能跳过)。
下面就直接上使用方法吧:
首先建立一个 HGLOBAL 的成员变量
HGLOBAL m_hMemBuf; 要保证它的生命周期,注意初始化。
char imgbuf[MAX_SIZE_IMAGE]; 文件缓冲区
CFile file; 读取文件
try
{
file.Open( cstrHeadPath,CFile::modeRead,NULL );
int iFileSize = file.Read( &imgbuf,sizeof( imgbuf ) - 1);
imgbuf[ iFileSize ] = '\0';
}
catch (CFileException* e)
{
return;
}
file.Close(); 关闭文件,这里就已经释放文件权限了,后面就只是对文件缓冲区内的操作了
m_hMemBuf = GlobalAlloc( GMEM_FIXED,MAX_SIZE_IMAGE ); 为变量分配内存空间,注意空间大小要足够放下你要的最 大图片,参数为自定的宏,可以按震求来
BYTE* pMem = ( BYTE* )GlobalLock( m_hMemBuf );
memcpy( pMem,imgbuf,MAX_SIZE_HEAD_IMAGE );
IStream* pStream;
CreateStreamOnHGlobal( m_hMemBuf,FALSE,&pStream);
Bitmap* pBitmap = Bitmap::FromStream( pStream );
GlobalUnlock( m_hMemBuf );
使用方法就是这些 ,一些函数方法不清楚的还是要查MSDN等相关资料,不作细述。
能力水平有限,这也只当作自己的记录,以便以后用的着,能帮到有需要的人更好。
所以有高手指点出来存在的问题更好,共同学习进步!