Как загрузить прозрачный PNG в растровое изображение и игнорировать альфа-канал - PullRequest
0 голосов
/ 25 июля 2011

Я вижу много вопросов о том, как загрузить PNG с альфа-каналом и отобразить его, но не о том, как загрузить PNG, который имеет альфа-канал, но игнорирует альфа-канал, раскрывая основные данные RGB.

Я пытался просто удалить все данные из альфа-канала, но я просто получаю черные пиксели вместо нужных мне цветовых данных.Кажется, что с момента создания объекта Bitmap он не содержит никакой информации о цвете в пикселях, где альфа равна 0, хотя я заверяю вас, что информация физически присутствует в PNG.

Чтобы быть понятным, еслимое изображение содержит пиксель со следующими значениями: (R: 255 G: 128 B: 128 A: 0) Мне нужно, чтобы этот пиксель был (R: 255 G: 128 B: 128 A: 255), а не (R: 0 G: 0 B: 0 A: 255).

Спасибо

РЕДАКТИРОВАТЬ: Предыдущая информация неверна.Растровое изображение содержит всю информацию при использовании:

Bitmap myImage = Bitmap("filename.png");

То, что я делал неправильно, впоследствии использует:

Bitmap otherImage = Bitmap(myImage);

ItКажется, это то, что сводит на нет данные, которые мне нужны.Вместо этого я теперь использую

Bitmap otherImage = (Bitmap)(myImage.Clone());

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

1 Ответ

4 голосов
/ 25 июля 2011

Попробуйте этот метод расширения:

    public static void SetAlpha(this Bitmap bmp, byte alpha)
    {
        if(bmp == null) throw new ArgumentNullException("bmp");

        var data = bmp.LockBits(
            new Rectangle(0, 0, bmp.Width, bmp.Height),
            System.Drawing.Imaging.ImageLockMode.ReadWrite,
            System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        var line = data.Scan0;
        var eof = line + data.Height * data.Stride;
        while(line != eof)
        {
            var pixelAlpha = line + 3;
            var eol = pixelAlpha + data.Width * 4;
            while(pixelAlpha != eol)
            {
                System.Runtime.InteropServices.Marshal.WriteByte(
                    pixelAlpha, alpha);
                pixelAlpha += 4;
            }
            line += data.Stride;
        }
        bmp.UnlockBits(data);
    }

Использование:

var pngImage = new Bitmap("filename.png");
pngImage.SetAlpha(255);
...