2011-09-10 19 views
12

HDD'de birkaç (~ 2GB) ham 24bpp RGB dosyası var. Şimdi bir kısmını almak ve istenilen boyuta getirmek istiyorum.
(izin verilen tek terazi, 1 olan 1/2, 1/4, 1/8, ..., 1/256)C# Piksel verisini System.Drawing.Bitmap'den verimli bir şekilde alma

Bu yüzden şu anda bir diziye ilgi dikdörtgenin her satırını okuyorum Beni doğru boyda fakat yanlış genişliğe sahip bir bitmap ile bırakır.

Bir sonraki adım olarak yeni oluşturulan diziden bir Bitmap oluşturuyorum.
Bu, bir işaretçi kullanılarak yapılır, böylece ilgili verilerin kopyalanması olmaz.
Sonraki Bitmap'teki GetThumbnailImage öğesini arıyorum, bu da doğru boyutlara sahip yeni bir bitmap oluşturur.

Şimdi yeni oluşturulan bitmap'in (bir bayt dizisi gibi) ham piksel verilerini dönmek istiyorum. Ama bunu başarmak için şu anda LockBits kullanarak verileri yeni bir diziye kopyayorum.

Yani benim soru: kopyalayarak olmadan bir bayt dizisi bir Bitmap'ten piksel verilerini almak için bir yolu var mı? gibi

şey:

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

Ben bu işe yaramazsa farkında değilim, bu temelde ulaşmak istediğimiz sadece bir örnektir.

+0

void *} {güvenli, [] bayt ıntptr ptr = bitmapData.Scan0 denemek için yerine, iş; int bytes = Math.Abs ​​(bitmapData.Stride) * bitmapData.Height; raw = yeni bayt [bayt]; Marshal.Copy (ptr, raw, 0, bayt); işlenmemiş olarak döndürülür; // byte [] – antonio

cevap

15

Bence bu en iyi bahistir.

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); 

Bayt çevresinde bir geçiş yapmak istiyorsanız, kopyalamanız gerekir []. Sen ayrılan bayt silmek zorunda değilsiniz

, sadece o ıdisposable uygulayan olarak yapıldığında orjinal Bitmap nesnesinin imha gerekir.

+0

Tam olarak beklediğim cevap değil, ama Marshal.Copy kullanarak, tamsayı başına tamsayı kopyalamaktan çok daha güzel görünmesini sağlar. Teşekkürler – Arokh

İlgili konular