C# 获取位图文件名

C# 获取位图文件名,c#,bitmap,save,filenames,C#,Bitmap,Save,Filenames,我使用下面这行创建位图: Bitmap b = new Bitmap(@"C:\<file name>"); Bitmap b=新位图(@“C:\”); 修改此位图并将其另存为以下行后: b.Save(@"C:\\<other file name>") b.Save(@“C:\\”) 我的问题是-如何从属性获取文件名位图。 简单地说,我需要用启动位图的人的名字保存位图 谢谢您可以使用一个变量: var name = @"C:\<file name>";

我使用下面这行创建位图:

Bitmap b = new Bitmap(@"C:\<file name>");
Bitmap b=新位图(@“C:\”);
修改此位图并将其另存为以下行后:

b.Save(@"C:\\<other file name>")
b.Save(@“C:\\”)
我的问题是-如何从属性获取文件名位图。
简单地说,我需要用启动位图的人的名字保存位图


谢谢

您可以使用一个变量:

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

还请注意,我已经使用语句将
位图
实例包装成了一个
,以便在使用完后立即释放与其关联的非托管资源。您应该始终使用
语句将
IDisposable
对象包装在
中。

您不这样做。很简单。基本上位图不记得文件-这是你的工作


你基本上会说:“我收到一张UPS发来的照片,在拆包后-几天后-我如何在照片上找到发货编号?”-你没有。投票结果被否决的答案会给你带来麻烦。从文件加载位图会锁定该文件。如果不先处理位图,则无法将其保存回去。这是一个鸡和蛋的问题,如果不克隆位图,就无法解决。这本身就有点棘手,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();
        }

也许你可以这样做,但我不熟悉这个主题,所以我不完全确定这是可能的,也不知道如何做。
我的建议是做一个类型

例如,您可以创建一个类,该类将为图像提供一个(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)考虑使用类代替。它是计算机的基类。如果您不确定要使用哪一个,请自问您的类是否需要图像或该格式的图像(即位图)。

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

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

一种可能的解决方法是使用位图的标记属性来存储创建时的路径

string pathToBitmap = @"C:\myImage.bmp";
Bitmap myBitmap = new Bitmap(pathToBitmap) { Tag = pathToBitmap };
..然后稍后检索路径

string pathFromBitmap = (string)myBitmap.Tag;

..只需确保将标记强制转换为字符串,并将标记复制到源位图生成的任何实例。

位图没有帮助,它不会跟踪文件名。位图也不必从文件创建,它有几个构造函数。你需要自己用一个字符串变量来跟踪它。发布的代码永远不会工作,它总是抛出一个ExternalException。从文件加载位图会对文件设置锁,这是由内存映射文件部分创建的锁,GDI+使用该部分将像素数据映射到内存。必须释放位图以释放锁。很好的鸡和蛋的问题:)使用位图(图像)构造函数来创建所需的副本。谢谢!这就是我要找的。为什么需要存储ImageFormat?因为您通常希望使用相同的图像格式保存更改后的位图。当您使用Image.Save(字符串)时,它不是自动的,它总是以PNG格式保存。
string pathFromBitmap = (string)myBitmap.Tag;