【问题标题】:C++ .NET - how to dispose a bitmap?C++ .NET - 如何处理位图?
【发布时间】:2012-05-20 12:38:48
【问题描述】:

我想从文件中加载位图,对其执行一些操作,然后以相同的文件名将其保存回来。模式是这样的:

Bitmap in = gcnew Bitmap(fileName);
Bitmap out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat);

fill [out] with data from [in]

out.Save(fileName);

但这不起作用。这很明显。我无法保存到仍然打开的文件(因为位图)。问题是:我到底要如何关闭位图?!我尝试了很多方法,但没有任何效果。调用 Dispose 在 C# 中工作,但此方法在 C++ 中受保护。调用删除也不起作用。解决办法是什么?

编辑: 对一个位图进行操作也不起作用。但是我发现了一个问题。调用删除工作。我忘了将我的位图声明为指针

Bitmap^ in = gcnew Bitmap(fileName);
Bitmap^ out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat);

fill [out] with data from [in]

delete in;
out.Save(fileName);

【问题讨论】:

标签: c++ .net bitmap c++-cli


【解决方案1】:

这是 C++/CLI 编码中的常见陷阱,您使用的是stack semantics。换句话说,您没有使用^ 帽子声明引用类型变量。这使得编译器在作用域块的末尾自动发出Dispose() 调用。非常方便,并且在 C++ 中模拟了RAII 模式,但它在这里遇到了麻烦。您想在保存新位图之前处置in 位图。

有两种方法可以做到这一点。您可以通过添加大括号来玩范围块的游戏:

Bitmap^ out;
try {
    {
        Bitmap in(fileName);
        out = gcnew Bitmap(in.Width, in.Height, in.PixelFormat);
        // etc..
    }   // <== "in" gets disposed here
    out->Save(fileName);
}
finally {
    delete out;
}

但这有点难看,尤其是因为在这种非常具体的情况下,它需要与out 混淆。另一种方法是明确地做所有事情:

Bitmap^ out;
Bitmap^ in;
try {
    in = gcnew Bitmap(fileName);
    out = gcnew Bitmap(in->Width, in->Height, in->PixelFormat);
    // etc..
    delete in;
    in = nullptr;
    out->Save(fileName);
}
finally {
    delete in;
    delete out;
}

【讨论】:

  • 所以在第二个例子中,delete in; 处理 in?
【解决方案2】:

您不需要out 位图。只需编辑in 并保存即可。另外我建议改用 CImage 类

CImage image;
image.Load(filename);
fill [image] with whatever data you want
image.Save(filename);

【讨论】:

  • 为什么建议使用CImage
  • 我只是觉得使用 IMO 更容易,而且它允许许多其他图像格式。
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多