Горе 'Stride' из объекта TransformedBitmap - PullRequest
7 голосов
/ 14 сентября 2010

У меня есть объект TransformedBitmap 2208 x 3000 с форматом {Indexed8}, который я использую .CopyPixels (). Я использую

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

(при условии, что 'formattedBitmap' - это имя изображения, из которого я пытаюсь скопировать пиксели) для значения "шага" в моем вызове метода и массива байтов длиной 2208 У меня есть нечто подобное, работающее в другом месте кода (где формат изображения {Gray8}. Однако, когда я пытаюсь сделать то же самое на вышеупомянутом изображении, я постоянно получаю «Аргумент вне диапазона» исключение говорит: «Значение параметра не может быть меньше, чем« 6624000 ». \ r \ nПараметр имени: буфер."

Мои вопросы по этому поводу: почему в мире один и тот же код работает в одном месте, а не в другом? Что в мире, с точки зрения непрофессионала, действительно является «шагом»? И как я могу получить желаемый эффект (копирование битов) без получения этой ошибки? Что я делаю не так?

Любая помощь в этом была бы очень признательна. Большое спасибо!

1 Ответ

9 голосов
/ 14 сентября 2010

Я понял это (вау ... вроде не могу поверить, что я потратил что-то около часа, возиться с этим!).Проблема заключалась в том, что байтовый массив должен иметь размер

sourceImage.PixelHeight * stride

, где

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

Причина, по которой он работал в другом месте в моем коде, заключается в том, что вместо копирования пикселейдля всего изображения (как я пытаюсь сделать там, где у меня возникла проблема), я копировал только пиксели одной строки ... то есть, в основном, область 2008 x 1, так что размер места назначенияМассив байтов может быть ровно 2208, и он будет работать нормально.Для дальнейшего использования, вероятно, следует использовать что-то подобное более или менее:

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

Приветствия!

...