8

以下の行を使用して、ビットマップを作成します。

Bitmap b = new Bitmap(@"C:\<file name>");

このビットマップを変更した後、次のように保存します。

b.Save(@"C:\\<other file name>")

私の質問は、プロパティからファイル名のビットマップを取得する方法です。
簡単に言えば、ビットマップを開始したときと同じ名前でビットマップを保存する必要があります。

ありがとう

4

6 に答える 6

8

賛成の答えはあなたを困らせるでしょう。ファイルからビットマップをロードすると、ファイルがロックされます。最初にビットマップを破棄しないと、元に戻すことはできません。これは、ビットマップを複製しないと解決できない鶏が先か卵が先かの問題です。Bitmap.Clone() メソッドは、最初にファイルをロックしたのと同じメモリ セクションを使用する最適化されたバージョンです。したがって、実際にはロックを解放しません。

以下は、ディープ クローンの作成を処理し、元のビットマップのパスと形式を記憶する小さなクラスです。

    class EditableBitmap : IDisposable {
        public EditableBitmap(string filepath) {
            using (var bmp = new Bitmap(filepath)) {
                this.bitmap = new Bitmap(bmp);
                this.bitmap.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
            }
            this.path = System.IO.Path.GetFullPath(filepath);
            this.format = bitmap.RawFormat;
        }

        public Bitmap Bitmap { get { return bitmap; } }

        public void Save() {
            bitmap.Save(path, format);
            this.Dispose();
        }

        public void Dispose() {
            if (bitmap != null) {
                bitmap.Dispose();
                bitmap = null;
            }
        }
        private Bitmap bitmap;
        private System.Drawing.Imaging.ImageFormat format;
        private string path;
    }

そして、次のように使用します。

        using (var bmp = new EditableBitmap(@"c:\temp\test.png")) {
            DoSomething(bmp.Bitmap);
            bmp.Save();
        }
于 2012-04-07T13:03:50.310 に答える
6

おそらく、メタデータを使用してこれを行うことができますが、私はこの主題に精通していないため、それが可能かどうかも完全にはわかりません。また、その方法もわかりません。
提案するのはタイプを作ることです。

したがって、たとえば、画像のBitmap (1)プロパティと、ファイルのパスの文字列を持つクラスを作成できます。

class LocalBitmap
{
    public Bitmap Bitmap { get; set; }
    public String Path { get; set; }

    public LocalBitmap(String path)
    {
        Path = path;
        Bitmap = new Bitmap(path);
    }
}

そしてそれを次のように使用します:

LocalBitmapimage = new LocalBitmap(@"C:\myImage.bmp");


(1)代わりにImageクラスの使用を検討してください。これはビットマップの基本クラスです。どちらを使用するかわからない場合は、クラスに画像またはその正確な形式の画像(つまり、ビットマップ)が必要かどうかを自問してください。

于 2012-04-07T13:14:09.990 に答える
5

変数を使用できます:

var name = @"C:\<file name>";

その後:

using (Bitmap b = new Bitmap(name))
{
    ...
    b.Save(name);
}

Bitmapまた、インスタンスをステートメントにラップして、using関連付けられているアンマネージ リソースを処理が終了したらすぐに解放できるようにしていることにも注意してください。IDisposableオブジェクトは常にusingステートメントでラップする必要があります。

于 2012-04-07T12:30:41.310 に答える
2

考えられる回避策は、Bitmap の Tag プロパティを使用して、作成時にパスを保存することです。

string pathToBitmap = @"C:\myImage.bmp";
Bitmap myBitmap = new Bitmap(pathToBitmap) { Tag = pathToBitmap };

..そして、後でパスを取得します..

string pathFromBitmap = (string)myBitmap.Tag;

..タグを文字列としてキャストし、ソースビットマップから作成されたインスタンスにタグをコピーするようにしてください。

于 2018-01-03T22:01:53.827 に答える
0

そうしない。単に。基本的に、ビットマップはファイルを覚えていません - それはあなたの仕事です。

あなたは基本的に、「開梱後、数日後にUPSから写真が送られてきました。写真の配送番号を見つけるにはどうすればよいですか?」と言います。-あなたはしません。

于 2012-04-07T12:31:44.553 に答える