Возникли проблемы с объектом BitmapSource в C # - PullRequest
1 голос
/ 10 декабря 2010

Я пытаюсь манипулировать изображением, я довольно новичок, когда дело доходит до растровых изображений и изображений, поэтому мне не хватает моих вопросов и кода. Я инициализирую байтовый массив для хранения данных пикселей Bgr24, чтобы я мог передать его в объект BitmapSource. Но мой массив пикселей имеет неправильный размер "я думаю".

Последняя строка кода на самом деле там, где моя проблема, параметр «пиксели» выдает мне следующую ошибку: «System.ArgumentException is unhandled Value Значение не попадает в ожидаемый диапазон».

Я инициализирую эти переменные

int imageSize = 100;
double dpi = 96;
int width = 128;
int height = 128;
byte[] pixels = new byte[width * height * 3];

//Create my image....

for (int i = 0; i < imageSize; i++) 
{
     for (int j = 0; j < imageSize; j++) 
            {
              int ct = myImage[i, j];

              pixels[i * imageSize * 3 + j + 0] = (byte)((ct % 16) * 14);
              pixels[i * imageSize * 3 + j + 1] = (byte)((ct % 32) * 7);
              pixels[i * imageSize * 3 + j + 2] = (byte)((ct % 128) * 2);

            }
}//end for

        //Create the bitmap
        BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width);

Я понимаю, что неправильно настраиваю массив пикселей. Есть мысли?

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

«Значение не попадает в ожидаемый диапазон» - это сообщение для ArgumentException, которое HRESULT.Check выдает, когда функция WIC (собственный API, лежащий в основе функции формирования изображений WPF), возвращает WINCODEC_ERR_INVALIDPARAMETER.

В этом случае проблема заключается в том, что конечный параметр BitmapSource.Create должен быть "шагом" растрового изображения (, а не ширина). «Шаг» растрового изображения - это (целое) число байтов, необходимое для хранения каждой строки растрового изображения. Согласно этой статье журнала MSDN , общая формула для расчета шага равна stride = (width * bitsPerPixel + 7) / 8;. Для растрового изображения 24bpp это упрощается до width * 3.

Чтобы предотвратить исключение, передайте правильное значение шага:

BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width * 3);
1 голос
/ 10 декабря 2010

Вот код, который я использую при работе с растровыми изображениями ...

private const int cRedOffset = 0;
private const int cGreenOffset = 1;
private const int cBlueOffset = 2;
private const int cAlphaOffset = 3;

var width = bmp.Width;
var height = bmp.Height;
var data = bmp.LockBits(Rectangle.FromLTRB(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
var stride = data.Stride;
var pixels = new byte[height * stride];

Marshal.Copy(data.Scan0, pixels, 0, height * stride);

for (var row = 0; row < height; row++)
{
    for (var col = 0; col < width; col++)
    {
        var pixel = (row * stride) + (col * 4);
        var red = pixels[pixel + cRedOffset];
        var green = pixels[pixel + cGreenOffset];
        var blue = pixels[pixel + cBlueOffset];
        var alpha = pixels[pixel + cAlphaOffset];
    }
}
...