gpt4 book ai didi

C++ .NET - 如何处理位图?

转载 作者:行者123 更新时间:2023-11-28 08:04:03 25 4
gpt4 key购买 nike

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

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++ 中 protected 。调用 delete 也不起作用。解决方案是什么?

编辑:在一张位图上操作也不起作用。但是我发现了一个问题。调用删除有效。我忘了将我的位图声明为指针

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++/CLI 编码中的一个常见陷阱,您正在使用 堆栈语义。换句话说,您没有使用 ^ 帽子声明引用类型变量。这使得编译器在范围 block 的末尾自动发出 Dispose() 调用。非常方便,并且是 C++ 中 RAII 模式的模拟,但它在这里妨碍了。您想在保存新位图之前处理 in 位图。

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

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;
}

关于C++ .NET - 如何处理位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10673468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com