如何提高在 C# 中经常使用位图的性能?
How to improve performance for oftenly using bitmaps in c#?
我正在尝试制作图像检查器。基本上它检查一个大图像(通常改变)是否包含一个 img(从不改变)。所以,为了提高性能,我正在寻找一种方法来将此图像保存在内存中,这样我就不会每次都去光盘了。
Bitmap img = Accord.Imaging.Image.FromFile(@"D:\img.png");
有什么好的解决办法吗?单例模式对我来说是个不错的选择吗?有 运行 个例子吗?
EDIT-1: WPF project.
多谢指教!
基本上最好避免使用 static/singleton 模式(一如既往最好避免使用它们)。您可以使用创建时加载的此位图编写一些存储库,然后将其存储在您正在使用的 类 的某个更高级别中。但有时这是检查单例的好方法 :)
这是一个基本的线程安全单例模式(里面有位图):
class Singleton
{
public Bitmap Image { get; set; }
private Singleton() { }
private static Singleton _instance;
private static readonly object _lock = new object();
public static Singleton GetInstance(Bitmap value = null)
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new Singleton();
if (value != null)
{
_instance.Image = value;
}
}
}
}
return _instance;
}
}
(摘自软件开发片段中最好的页面之一:https://refactoring.guru/design-patterns/singleton/csharp/example#example-1)
那么您的第一次加载将是:
var singleton = Singleton.GetInstance(Accord.Imaging.Image.FromFile(@"D:\img.png"));
下一个:
var image = Singleton.GetInstance().Image;
我正在尝试制作图像检查器。基本上它检查一个大图像(通常改变)是否包含一个 img(从不改变)。所以,为了提高性能,我正在寻找一种方法来将此图像保存在内存中,这样我就不会每次都去光盘了。
Bitmap img = Accord.Imaging.Image.FromFile(@"D:\img.png");
有什么好的解决办法吗?单例模式对我来说是个不错的选择吗?有 运行 个例子吗?
EDIT-1: WPF project.
多谢指教!
基本上最好避免使用 static/singleton 模式(一如既往最好避免使用它们)。您可以使用创建时加载的此位图编写一些存储库,然后将其存储在您正在使用的 类 的某个更高级别中。但有时这是检查单例的好方法 :) 这是一个基本的线程安全单例模式(里面有位图):
class Singleton
{
public Bitmap Image { get; set; }
private Singleton() { }
private static Singleton _instance;
private static readonly object _lock = new object();
public static Singleton GetInstance(Bitmap value = null)
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new Singleton();
if (value != null)
{
_instance.Image = value;
}
}
}
}
return _instance;
}
}
(摘自软件开发片段中最好的页面之一:https://refactoring.guru/design-patterns/singleton/csharp/example#example-1)
那么您的第一次加载将是:
var singleton = Singleton.GetInstance(Accord.Imaging.Image.FromFile(@"D:\img.png"));
下一个:
var image = Singleton.GetInstance().Image;