一尘不染

Bitmap.Clone()和新的Bitmap(Bitmap)有什么区别?

c#

据我所知,有两种复制位图的方法。

Bitmap.Clone()

Bitmap A = new Bitmap("somefile.png");
Bitmap B = (Bitmap)A.Clone();

新的Bitmap()

Bitmap A = new Bitmap("somefile.png");
Bitmap B = new Bitmap(A);

这些方法有何不同?我对内存和线程方面的差异特别感兴趣。


阅读 834

收藏
2020-05-19

共1个答案

一尘不染

这是“深”副本和“浅”副本之间的共同区别,这也是几乎不建议使用的IClonable接口的问题。Clone()方法创建一个新的Bitmap对象,但像素数据与原始位图对象共享。Bitmap(Image)构造函数还会创建一个新的Bitmap对象,但是该对象具有自己的像素数据副本。

SO上有很多关于Clone()的问题,程序员希望它避免使用位图的典型麻烦,位图是从中加载文件的锁。没有。一种可能的实际用法是避免使用库方法的麻烦,该库方法在传递的位图上不适当地调用Dispose()。

利用像素格式转换或裁剪选项的优势,重载可能会很有用。

2020-05-19