Рисование растрового изображения с небезопасным доступом к пикселю приводит к пустому изображению - PullRequest
1 голос
/ 27 февраля 2011

У меня есть класс, который создает матрицу значений Color, читая Bitmap. Класс непосредственно читает каждый байт в пикселях внутри блока unsafe, используя указатель на изображение. Цель этого класса - прочитать значения пикселей в память, где я могу запустить фильтры для них перед сохранением изображения в виде нового файла.

Я могу воссоздать изображение, используя метод setPixel () GDI + , однако это слишком медленно для моих нужд.

Я пытаюсь сохранить новый файл изображения, используя следующую функцию:

    public void saveImageFromPixels()
    {

        this.newBitmap = new Bitmap(srcBitmap.Width, srcBitmap.Height);

        BitmapData imgData = newBitmap.LockBits(new Rectangle(0, 0, newBitmap.Width, newBitmap.Height),
                                                ImageLockMode.ReadWrite,
                                                PixelFormat.Format24bppRgb);

        int stride = imgData.Stride;
        System.IntPtr Scan0 = imgData.Scan0;

        unsafe
        {
            byte* p = (byte*)(void*)Scan0;
            int nOffset = stride - newBitmap.Width * 3;

            for (int x = 0; x < newBitmap.Height; ++x)
            {

                for (int y = 0; y < newBitmap.Width; ++y)
                {
                    p[0] = (byte)(255 - matrix[y][x].B);
                    p[1] = (byte)(255 - matrix[y][x].G);
                    p[2] = (byte)(255 - matrix[y][x].R);
                    p += 3;
                }
                p += nOffset;
            }


        }

        this.newBitmap.Save(@"C:\images\1-d.jpg");
    }

Однако в результате получается пустое изображение (с правильными размерами). Код, который напрямую обращается к пикселям и сохраняет значение как Color, работает нормально, он просто сохраняет изображение, с которым у меня проблемы.

Следующий код определяет srcBitmap и newBitmap

    private Bitmap srcBitmap;
    private Bitmap newBitmap;
    private List<List<Color>> matrix;

    public PixelMatrix(string path)
    {

        this.srcBitmap = new Bitmap(path);

        this.matrix = new List<List<Color>>(srcBitmap.Width);

        for (int x = 0; x < srcBitmap.Width; x++)
        {
            this.matrix.Add(new List<Color>(srcBitmap.Height));
        }

    }

1 Ответ

4 голосов
/ 27 февраля 2011

Вам нужно UnlockBits().

...