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

也许您可以使用元数据来做到这一点- 但我不熟悉这个主题,所以我不完全确定它是否可能,我也不知道如何去做。
建议是制作一个类型。

因此,例如,您可以创建一个类,该类将具有图像的位图(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类。它是Bitmap的基类。如果您不确定要使用哪一个,请问您自己的课程是否需要图像或该精确格式的图像(即位图)。

于 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 回答
0

解决 Hans 描述的锁定文件问题的另一种方法是锁定freeze图像。

public PhotoImageSource GetImage()
{
    string filename = "c:\Images\myimage.png";
    var image = new BitmapImage();
    using (var stream = new FileStream(fileName, FileMode.Open))
    {
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.StreamSource = stream;
        image.EndInit();
    }
    image.Freeze(); //prevent error "Must create DependencySource on same Thread as the DependencyObject"
    return new PhotoImageSource(image, filename);
}

public class PhotoImageSource
{
    public PhotoImageSource(ImageSource image, string filename)
    {
        Image = image;
        Filename = filename;
    }
    public ImageSource Image { get; set; }
    public string Filename { get; set; }
}
于 2015-08-11T05:06:30.817 回答