Magick++ Bitmap::GetThumbnailImage() 块文件,无法删除

Posted

技术标签:

【中文标题】Magick++ Bitmap::GetThumbnailImage() 块文件,无法删除【英文标题】:Magick++ Bitmap::GetThumbnailImage() blocks file, unable to delete it 【发布时间】:2017-05-10 15:24:54 【问题描述】:

各位程序员大家好。

首先,我的 C/C++ 经验只有 5 周。 (我目前是一名实习生,在我的实际工作中通常使用 Java)

我正在开发一个读取 .tif 文件并将其显示给用户的应用程序。用户查看完图像后,应将其关闭并从硬盘中删除。

问题是我关闭后无法删除图像。 我认为图像进程仍在运行,这会拒绝我的程序删除文件。

我的猜测是,即使我在位图上使用了delete pCloneBmp;,Gdiplus 也会以某种方式保持文件打开。有没有人有想法或尝试过与 Gdiplus 类似的东西?

我尝试了这段代码来删除文件(下一个代码块中的解释):

delete pCloneBmp;
delete gdiZoomedLoaded;
delete gdiOrgLoaded;
DeleteObject( bmpLoaded );
remove( filenames.at( 0 ).c_str( ) );
WORD error = GetLastError( ); 
// error codes:
// 0 == Success
// 32 == The process cannot access the file because it is being used by another process. 

这是我尝试做的:

// This is how I call the function.
scale_image( (Gdiplus::Bitmap*)gdiOrgLoaded , x_bmp , y_bmp , org_width_bmp , org_height_bmp , scale_bmp );

// vvv Function definition vvv
HBITMAP scale_image( Gdiplus::Bitmap *old_bmp , int x , int y , int width ,  int height , float scale )

HBITMAP result = NULL;
int newWidth = width * scale;
int newHeight = height * scale;

Gdiplus::RectF bmpRect( 0 , 0 , newWidth , newHeight );
Gdiplus::Bitmap *pCloneBmp = old_bmp->Clone( 0 , 0 , width , height , old_bmp->GetPixelFormat() );

// If I run the deletion code here the error code is 0
// and the file gets deleted

// vvv It seems that this line causes the problem vvv
pCloneBmp = ( Gdiplus::Bitmap* )pCloneBmp->GetThumbnailImage( newWidth , newHeight );

// If I run the deletion code here the error code is 32
// and the file won't be deleted

Gdiplus::Graphics *pGraphics = Gdiplus::Graphics::FromImage( pCloneBmp );
pGraphics->DrawImage( pCloneBmp , bmpRect , 0 , 0 , newWidth , newHeight , Gdiplus::UnitPixel );

if ( pCloneBmp )

    pCloneBmp->GetHBITMAP( Gdiplus::Color( 255 , 255 , 255 ) , &result );


delete( gdiZoomedLoaded );

gdiZoomedLoaded = pCloneBmp;

delete pGraphics;

return result;

非常感谢任何帮助:-)

编辑:这是我加载图像的方式

gdiOrgLoaded = Gdiplus::Image::FromFile( pFilePath , false );
gdiZoomedLoaded = Gdiplus::Bitmap::FromFile( pFilePath , false );

HBITMAP result; // <-- This is bmpLoaded
gdiZoomedLoaded->GetHBITMAP( Gdiplus::Color( 255 , 255 , 255 ) , &result );

【问题讨论】:

您没有显示打开文件的位置/方式。如果old_bmp 打开文件 - 你也需要删除它 对不起,我在问题中添加了它。在这种情况下,old_bmpgdiOrgLoaded 这只是一个简单的错误,您丢失了原始 pCloneBmp 指针值与分配。由于您没有删除它,因此您有内存泄漏,最明显的副作用是文件没有关闭。使用另一个变量。 【参考方案1】:

所以我确实想通了。正如@HansPassant 所建议的,这确实是一些内存泄漏。

现在这是我的工作职能。我也设法缩短了很多。

HBITMAP scale_image( Gdiplus::Bitmap *old_bmp , int x , int y , int width , int height , float scale )

HBITMAP result = NULL;
int newWidth = width * scale;
int newHeight = height * scale;

Gdiplus::Bitmap* newBitmap = new Gdiplus::Bitmap( newWidth , newHeight , old_bmp->GetPixelFormat( ) );
Gdiplus::Graphics *pGraphics = Gdiplus::Graphics::FromImage( newBitmap );
pGraphics->DrawImage( old_bmp , 0 , 0 , newWidth , newHeight );

delete( gdiZoomedLoaded );

gdiZoomedLoaded = newBitmap;

delete pGraphics;

return result;

【讨论】:

以上是关于Magick++ Bitmap::GetThumbnailImage() 块文件,无法删除的主要内容,如果未能解决你的问题,请参考以下文章

Magick.net 调整 GIF 大小,最终文件更大

使用R magick包时出错

保留图像中的纵横比::Magick 的缩略图功能

循环写入多个图像 [Magick, R]

Magick++ Bitmap::GetThumbnailImage() 块文件,无法删除

rails4.2.8carrierwave+mini_magick+Jcrop,图片上传失败