본문 바로가기
프로그래밍/c#

[c#] Bitmap.Clone() vs new Bitmap

by 그래도동 2018. 9. 4.
728x90
반응형

Bitmap.Clone() vs new Bitmap 비교


Bitmap.Clone()

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

Bitmap.Clone() 메서드는 새 비트맵 개체를 생성하지만 픽셀 데이터는 원래 비트맵 개체와 공유


new Bitmap()

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

new Bitmap() 생성자는 픽셀 데이터의 자체 복사본이 있는 비트맵 개체를 새로 생성한다.



그런데

Bitmap.Clone() 비트맵을 dispose() 코드에 대한 참조를 전달하고 개체를 손실하지 않으려는 경우에만 사용해야 한단다. 

왜냐하면 원본 파일을 잠금상태로 유지하기 때문에 문제가 있는듯하다.


LockBits을 사용하면 원본과 복제본에 대해 서로 다른 메모리 블록이 생성된다.


Bitmap original = new Bitmap("Test.jpg");
Bitmap clone = (Bitmap) original.Clone();
BitmapData odata = original.LockBits(new Rectangle(0, 0, original.Width, original.Height), ImageLockMode.ReadWrite, original.PixelFormat);
BitmapData cdata = clone.LockBits(new Rectangle(0, 0, clone.Width, clone.Height), ImageLockMode.ReadWrite, clone.PixelFormat);
Assert.AreNotEqual(odata.Scan0, cdata.Scan0);



성능차이도 있다.


new Bitmap()은 

목록에 50개의 복사본을 저장하는 데 6.2초가 소요되어 1.7GB의 메모리를 사용했다. (원래 이미지는 24bpp 및 3456 x 2400 픽셀 = 25MB).


Bitmap.Clone()

 0.7초 동안 목록에 1,000,000개의 copy를 저장할 수 있으며 0.9GB를 메모리를 사용했다.


Bitmap.Clone() 훨씬 가볍다.


이상으로 Bitmap.Clone() vs new Bitmap을 알아보았다. 




이상한 것, 틀린 것 모두 피드백 해주시면 감사하겠습니다.


출처 : https://stackoverflow.com/questions/12709360/whats-the-difference-between-bitmap-clone-and-new-bitmapbitmap

728x90
반응형

댓글