GDI + LockBits / Alpha - PullRequest
       1

GDI + LockBits / Alpha

0 голосов
/ 05 сентября 2010

Я пытаюсь создать обтравочную маску из PNG с альфа-каналом, копируя альфа-значения из моего PNG по другому изображению того же размера.Все используют LockBits, а затем UnlockBits.Похоже, что мой канал настроен правильно, но я не вижу, чтобы он использовался в последующих операциях рисования.

В попытке максимально упростить вещи я использовал практически ту же логику, чтобы установитьзначение красного канала в одном изображении, но после сохранения изображения снова без изменений.Если я пошагово пройдусь по коду, корректно устанавливается красный канал.Вот этот упрощенный код.Любые комментарии или помощь приветствуется.

        var image = Image.FromFile(@"C:\imaging\image.jpg");
        image.LoadRed();
        image.Save(@"C:\imaging\output.jpg");

    // image.jpg and output.jpg are the same.
    // I would expect output to be washed over with lots of red but it isn't

   public static void LoadRed(this Image destination)
    {
        var destinationBitmap = new Bitmap(destination);

        const int blueChannel = 0;
        const int greenChannel = 1;
        const int redChannel = 2;
        const int alphaChannel = 3;

        var rec = new Rectangle(Point.Empty, destination.Size);

        var destinationData = destinationBitmap.LockBits(rec, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

        unsafe
        {
            byte* destinationPointer = (byte*)destinationData.Scan0.ToPointer();

            destinationPointer += redChannel;

            for (int i = rec.Width * rec.Height; i > 0; i--)
            {
                *destinationPointer = 255;
                destinationPointer += 4;
            }
        }

        destinationBitmap.UnlockBits(destinationData);
    }

1 Ответ

2 голосов
/ 05 сентября 2010

Ваша проблема связана с тем, что вы создаете новый экземпляр Bitmap, используя изображение, предоставленное вашему методу расширения в качестве параметра.Однако после завершения метода вы сохраняете исходное изображение, а не измененное растровое изображение.

Измените метод расширения для работы с типами System.Drawing.Bitmap.

...