2011-09-10 3 views
12

하드 디스크에 여러 개의 (~ 2GB) 원시 24bpp RGB 파일이 있습니다. 이제 그 중 일부를 검색하여 원하는 크기로 조정하려고합니다.
(허용되는 눈금은 1, 1/2, 1/4, 1/8, ..., 1/256)C# System.Drawing.Bitmap에서 효율적으로 픽셀 데이터 얻기

그래서 현재 관심있는 사각형의 모든 라인을 배열로 읽습니다 , 높이가 있지만 너비가 잘못된 비트 맵을 남겨 둡니다.

다음 단계로 새로 만든 배열에서 비트 맵을 만듭니다.
데이터를 복사하지 않으므로 포인터를 사용하여이 작업을 수행합니다.
다음 올바른 크기로 새 비트 맵을 만드는 비트 맵에서 GetThumbnailImage를 호출합니다.

이제 새로 만든 비트 맵의 ​​원시 픽셀 데이터 (바이트 배열로)를 반환하고 싶습니다. 그러나이를 달성하기 위해 현재 LockBits를 사용하여 데이터를 새로운 배열에 복사하고 있습니다.

내 질문은 : 픽셀 데이터를 복사하지 않고 비트 맵에서 바이트 배열로 가져 오는 방법이 있습니까? 같은

뭔가 :

var bitmapData = scaledBitmap.LockBits(...) 
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer() 
scaledBitmap.UnlockBits(bitmapData) 
return rawBitmapData 

나는이 작동하지 않는 것을 잘 알고 있어요, 그것은 기본적으로 내가 무엇을 달성하고자하는 단지 예입니다.

+0

작동하려면 안전하지 않은 {} void *에서 byte [] 대신 IntPtr ptr = bitmapData.Scan0; int bytes = Math.Abs ​​(bitmapData.Stride) * bitmapData.Height; raw = 새 바이트 [바이트]; Marshal.Copy (ptr, raw, 0, bytes); return raw; // byte [] – antonio

답변

15

이것이 최선의 방법이라고 생각합니다.

var bitmapData = scaledBitmap.LockBits(...); 
var length = bitmapData.Stride * bitmapData.Height; 

byte[] bytes = new byte[length]; 

// Copy bitmap to byte[] 
Marshal.Copy(bitmapData.Scan0, bytes, 0, length); 
scaledBitmap.UnlockBits(bitmapData); 

바이트를 통과 시키려면 복사해야합니다.

할당 된 바이트를 삭제할 필요없이 IDisposable을 구현할 때 원래 Bitmap 개체를 삭제하면됩니다.

+0

정확한 대답은 아니지만 Marshal.Copy를 사용하면 정수 당 정수를 복사하는 것보다 훨씬 더 멋지게 보입니다. 감사 – Arokh

관련 문제