0

ファイルからビットマップをロードし、いくつかの操作を実行して、同じファイル名で保存したいと考えています。パターンは次のとおりです。

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++ で保護されています。delete の呼び出しも機能しません。解決策は何ですか?

編集: 1 つのビットマップでの操作も機能しません。しかし、問題が見つかりました。削除の呼び出しが機能しました。ビットマップをポインターとして宣言するのを忘れていました

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);
4

2 に答える 2

1

これは、使用している C++/CLI コーディングの一般的なトラップですstack semantics。つまり、^帽子で参照型変数を宣言していません。Dispose()これにより、スコープブロックの最後でコンパイラが自動的に呼び出しを発行します。非常に便利で、C++ でのパターンのシミュレーションですが、RAIIここでは邪魔になります。in新しいビットマップを保存する前にビットマップを破棄したい。

これを行うには 2 つの方法があります。中括弧を追加することで、スコープ ブロックでゲームをプレイできます。

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;
}
于 2012-05-20T13:18:20.040 に答える
0

outビットマップは必要ありません。編集inして保存するだけです。また、代わりに CImage クラスを使用することをお勧めします

CImage image;
image.Load(filename);
fill [image] with whatever data you want
image.Save(filename);
于 2012-05-20T12:44:00.857 に答える