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;