2010-09-14 31 views
7

Tôi có đối tượng 220ed x 3000 TransformedBitmap có định dạng {Indexed8} mà tôi đang làm .CopyPixels() trên. Tôi đang sử dụng'Vượt qua' Tai họa từ đối tượng TransformedBitmap

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7)/8) 

(giả sử 'formattedBitmap' là tên của hình ảnh mà từ đó tôi đang cố gắng để sao chép các điểm ảnh) cho giá trị 'sải chân' trong cuộc gọi phương pháp của tôi và một mảng các byte đó là Chiều dài 2208. Tôi có một cái gì đó giống như này làm việc ở nơi khác trong mã (nơi định dạng của hình ảnh là {Gray8}. Tuy nhiên, nơi tôi đang cố gắng để làm điều tương tự trên hình ảnh nói trên, tôi liên tục nhận được một "Đối số ra khỏi phạm vi" ngoại lệ nói "Giá trị tham số không thể nhỏ hơn '6624000'. \ r \ n Tên tham số: bộ đệm."

Câu hỏi của tôi về điều này là: tại sao mã giống hệt nhau lại hoạt động ở một nơi chứ không phải Điều gì khác trên thế giới, theo nghĩa của giáo dân, thực sự là 'sải chân'? Và làm thế nào tôi có thể có được ảnh hưởng mong muốn (sao chép các bit) mà không bị lỗi này? Tôi đang làm gì sai? điều này sẽ được đánh giá rất nhiều. Cảm ơn rất nhiều!

Trả lời

9

Tôi đã tìm ra điều này (wow ... không thể tin rằng tôi đã dành một cái gì đó tối một giờ rối tung với điều này!). Vấn đề là các mảng byte phải có kích cỡ

sourceImage.PixelHeight * stride 

nơi

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 

Lý do mà nó làm việc ở vị trí khác trong mã của tôi là bởi vì thay vì sao chép các điểm ảnh cho toàn bộ hình ảnh (như tôi đang cố gắng làm nơi mà tôi gặp vấn đề), tôi chỉ sao chép các điểm ảnh của một hàng duy nhất ... đó là, về cơ bản là một khu vực 2008 x 1, sao cho kích thước của mảng byte đích có thể chính xác 2208 và nó sẽ hoạt động tốt. Để tham khảo trong tương lai, một cái gì đó như thế này có thể luôn luôn, ít nhiều, được sử dụng:

int width = source.PixelWidth; 
int height = source.PixelHeight; 
int stride = width * ((source.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

source.CopyPixels(bits, stride, 0); 

Chúc mừng!

+4

Ồ, và MSDN có một bài viết khá tốt về những gì 'sải chân'. Nó chắc chắn không phải là thuật ngữ "layman" và tôi thực sự tìm thấy nó một chút convulated, nhưng nó là một tài liệu tham khảo tốt không-ít (chỉ là một trong những bạn có thể cần phải đọc qua nhiều lần để thực sự hiểu nếu you'r mới để xử lý hình ảnh trong C# (như tôi!)) LINK: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

Là một người có xu hướng lướt qua mã (tất cả chúng ta đều vội vàng phải không?) Tôi thấy tính toán sải chân của bạn (tính sai) và dành nửa giờ cố gắng làm cho nó hoạt động trước khi nhận ra rằng bạn đã có công thức chính xác xa hơn. Nó sẽ là tốt đẹp để có công thức chính xác ở đầu :) – Peter

Các vấn đề liên quan