GDI+ 通过流方式操作图片文件,避免文件权限冲突

来源:互联网 发布:lr推荐算法 编辑:程序博客网 时间:2024/06/08 02:55

在程序中,很多使用GDI+,很多要操作图片文件的地方。当然我们有Bitmap 类,有Bitmap::FromFile 函数,只需要指定文件路径,后面的一切都那么轻松!

但是,当你载入图片后,你的程序就拿到了此图片文件的权限了,你要再在系统中去操作该图片(如重命名)的时候,则会出现访问受限的警告的!你只能结束你的程序才可以!

我在这里的办法则是把图片文件直接读到内存中去,然后释放文件权限,后面的操作就和文件无关了!此处也还是用到了Bitmap中的另外一个方法 Bitmap::FromStream ,

由于此方法操作起来不是很方便,所以我在之前是很少用它的,但是在这个时候,用它来处理是很理想的。

使用 Bitmap::FromStream 流处理的时候,要用到另外一个东西 HGLOBAL,在这里只提一下,这不是我们的重点(能力也有限,也讲不清楚大笑,只能跳过)。

下面就直接上使用方法吧:

  首先建立一个  HGLOBAL 的成员变量

HGLOBALm_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等相关资料,不作细述。

能力水平有限,这也只当作自己的记录,以便以后用的着,能帮到有需要的人更好。

所以有高手指点出来存在的问题更好,共同学习进步!

原创粉丝点击