热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GDI+中如何释放Bitmap对象??请高人指点!!!急(可以加分)

我用Windows2000+VC6.0的平台我现在要处理多付JPG图象,我自己定义了一个类用来生成Bitmap*对象.构造函数定义如下:MyPhoto::MyPhoto(CStringstri
我用Windows 2000+VC6.0的平台
我现在要处理多付JPG图象,我自己定义了一个类用来生成Bitmap*对象.构造函数定义如下:
MyPhoto::MyPhoto(CString stringOpenFileName)
{
    fileName=stringOpenFileName;
if(fileName!="")
{
  Bitmap Ori_photo(ToWChar(fileName.GetBuffer(fileName.GetLength())));
  INT iWidth=Ori_photo.GetWidth();
  INT iHeight=Ori_photo.GetHeight();
//photo和 iphoto都是MyPhoto的成员变量,类型为Bitmap *
  photo=Ori_photo.Clone(0,0,iWidth,iHeight,PixelFormatDontCare);
  iphoto=photo->Clone(0,0,iWidth,iHeight,PixelFormatDontCare);

}
}
可是当我处理第二张图象时,发现Ori_photo对象失效,它一直占用着内存.
请问该怎么办??
我是基于对话框的工程,是不是要发送一个消息来关闭它,我不知道怎么办!!!!
为什么我不能用
  Bitmap mybitmap=new Bitmap("filename");
构造Bitmap 对象?

8 个解决方案

#1


我经常使用gdi+,从来没有遇到问题,你的问题有点奇怪,估计错误在其它原因,
Bitmap *pmybitmap = new Bitmap("unicode_filename");
注意你的指针写法!!!

上面的问题不应该存在

#2


關注.

#3


我一用下面这种方式定义,编译就不然通过
Bitmap *pmybitmap = new Bitmap("unicode_filename");
我的平台是windows2000+VC6.0
是不是配置有问题??

#4


我在StdAfx.h中加入如下申明:
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif

#include "Gdiplus.h"
#pragma comment(lib,"GdiPlus.lib")
using namespace Gdiplus;
是不是还要引入其他空间名?我以前在视图/文档结构中用得很顺手的,我想问题应该出在析够函数中,可能是对话框的管理方式的差异吧!


HELP ME!!!

#5


我设置了一个临时工作文件:TEMPFILE(是待处理文件的副本)
现在的问题是:第一次打开TEMPFILE后,我即使删除了处理好的对象,但并没有释放对TEMPFILE的控制权,第二个文件的副本不能生成,导致new Myphoto(TEMPFILE)时出错,请大家帮忙来看看.

#6


关于new操作符的问题实际上是MS的BUG,解决方法如下:
-----------------------------------------------------------
// QGdiPlus.h: interface for the QGdiPlus class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_)
#define AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// ------------------------------------------------------------ [11/14/2003]
// Some Macro and definitions of GdiPlus environment

#define iterator _iterator

#ifdef _DEBUG

static int nGdiPlusObjects = 0;

namespace Gdiplus
{
namespace DllExports
{
#include 
};

#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
nGdiPlusObjects--;
DllExports::GdipFree(in_pVoid);
}

void* (operator new)(size_t in_size)
{
nGdiPlusObjects++;
return DllExports::GdipAlloc(in_size);
}

void (operator delete[])(void* in_pVoid)
{
nGdiPlusObjects--;
DllExports::GdipFree(in_pVoid);
}

void* (operator new[])(size_t in_size)
{
nGdiPlusObjects++;
return DllExports::GdipAlloc(in_size);
}

void * (operator new)(size_t nSize, LPCSTR /*lpszFileName*/, int /*nLine*/)
{
nGdiPlusObjects++;
return DllExports::GdipAlloc(nSize);
}

void operator delete(void* p, LPCSTR /*lpszFileName*/, int /*nLine*/)
{
nGdiPlusObjects--;
DllExports::GdipFree(p);
}

};
#endif // #ifndef _GDIPLUSBASE_H
}
#endif // #ifdef _DEBUG


// ------------------------------------------------------------ [11/14/2003]
// an assistant class of GdiPlus environment

#include 

#ifdef _MFC_VER
#include 
#endif
#undef iterator

//using namespace Gdiplus; // must know well this namespace may conflict with some stl definitions
#pragma comment (lib, "Gdiplus.lib")

class QGdiPlus  
{
public:
QGdiPlus(): m_Token(0) { Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartup(& m_Token, & input, NULL); }
~QGdiPlus()
{
Gdiplus::GdiplusShutdown(m_Token);
#ifdef _DEBUG
#ifdef _MFC_VER
if (nGdiPlusObjects > 0)
afxDump << _T(">>> GdiPlus Memory Leaks: ") << nGdiPlusObjects << _T(" objects! <<<\n");
else if (nGdiPlusObjects < 0)
afxDump << _T(">>> GdiPlus Multiple Deletes: ") << -nGdiPlusObjects << _T(" objects! <<<\n");
#endif
#ifdef _ATL_VER
if (nGdiPlusObjects > 0)
ATLTRACE2(_T(">>> GdiPlus Memory Leaks: %d objects! <<<\n"), nGdiPlusObjects);
else if (nGdiPlusObjects < 0)
ATLTRACE2(_T(">>> GdiPlus Multiple Deletes: %d objects! <<<\n"), -nGdiPlusObjects);
#endif
#endif
}
private:
// The token we get from GDI+
ULONG_PTR m_Token;
};

#endif // !defined(AFX_QGDIPLUS_H__AFE8336A_F370_4687_904E_60D117BCBE45__INCLUDED_)
----------------------------------------
将上述代码保存成.h文件加入Project,然后在App类中从QGdiplus派生对象作为成员变量即可完成gdi+初始化以及new问题。

#7


好方法!!
UP

#8


谢谢CADINFO:
让我对GDI+又回复了信心!

在APP中我是这样初始化:
  GdiplusStartup(&gdiplusToken, &m_gdiplusStartupInput, NULL);
以下为关闭:
  GdiplusShutdown(gdiplusToken);
是分别在前面加一个Q吗?

我在工程中加入QGdiplus.h后,编译出错:
e:\wanjie\三人组集成_1215\qgdiplus.h(26) : fatal error C1083: Cannot open include file: 'GdiplusMem.h': No such file or directory
MyPhoto.cpp
e:\wanjie\三人组集成_1215\qgdiplus.h(26) : fatal error C1083: Cannot open include file: 'GdiplusMem.h': No such file or directory
Error executing cl.exe.
第26行代码为: #include 
可是,我的GdiplusMem.h文件已经包含在当前目录下
扑通,扑通!我扑通了


推荐阅读
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
author-avatar
一直都在囚禁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有