Создать изображение с некоторыми прозрачными частями - PullRequest
2 голосов
/ 13 марта 2009

Я пытаюсь сгенерировать небольшой квадрат 32 на 32 пикселя с прозрачным зазором 10 на 10 в середине.

Это то, что я имею до сих пор:

private Image CreatePicture(){
    // Create a new Bitmap object, 32 x 32 pixels in size
    Bitmap canvas = new Bitmap(32,32,System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
    for(int i=10;i<21;i++){
        for(int p=10;p<21;p++){
            canvas.SetPixel(i,p,Color.Lime);
        }
    }
    canvas.MakeTransparent(Color.Lime);
    // return the picture
    return canvas;
}

Это грубо и не будет окончательной "оптимизированной версией", это всего лишь грубый демонстрационный скрипт. Проблема в том, что возвращаемое изображение не прозрачное, а просто серое поле: (.

Любая помощь приветствуется.

Michael

UPDATE: Я обновил скрипт, установив PixelFormat в формат Alpha RGB, который он действительно принимает без ошибок во время выполнения. Теперь, если я удаляю "canvas.MakeTransparent (Color.Lime);" линия показывает в середине прямоугольник с лаймом, просто серый блок того же цвета, что и серый фон; кажется, что прозрачность распознается, но не влияет на прозрачность!

private Bitmap CreatePicture(){
    // Create a new Bitmap object, 50 x 50 pixels in size
    Bitmap canvas = new Bitmap(82,82,System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    for(int i=10;i<71;i++){
        for(int p=10;p<71;p++){
            canvas.SetPixel(i,p,Color.Lime);
        }
    }
    canvas.MakeTransparent(Color.Lime);
    // return the picture
    return canvas;
}

Ответы [ 5 ]

3 голосов
/ 13 марта 2009
[...]Format16bppRgb555

Попробуйте использовать какой-нибудь формат с альфа-каналом (... Rgba) здесь. Кроме того, если на выходе будет изображение позже, убедитесь, что вы используете формат изображения, например PNG, который поддерживает альфа-каналы.

2 голосов
/ 13 марта 2009

Это зависит от того, как вы собираетесь использовать или отображать изображение. PNG и Gif - это два формата файлов, которые поддерживают прозрачность.

Для настройки прозрачности растрового изображения я использовал:

Graphics.FromImage (bitmap) .FillRectangle (Brushes.Transparent, ...), чтобы установить область, которую я хотел, как прозрачную, затем я сохранил файл как PNG, чтобы получить изображение с прозрачностью.

Я также попробовал метод MakeTransparent и столкнулся с проблемами, и Brushes.Transparent был решением, которое работало для моей ситуации.

Надеюсь, что это дает вам направление для изучения.

Последнее замечание: я создаю объект Bitmap только с шириной и высотой, я не указываю формат пикселя или что-то, что называется, т.е. bitmap = New Bitmap (width, height);

1 голос
/ 13 марта 2009

Возможно, вам нужно изменить формат изображения на Format16bppArgb1555.

Прямо сейчас вы используете Format32bppArgb или Format16bppRgb555, то есть 16 бит на пиксель без альфа-информации. Прозрачность требует наличия альфа-канала или альфа-бита.

0 голосов
/ 08 апреля 2009

Функция MakeTransparent работает. У вас есть «серые пятна», потому что ваш TransparencyKey неверен. Вы обнаружите, что если вы установите для своего свойства TransparencyKey любой цвет, к которому относится серое пятно, серые пятна действительно станут прозрачными при отображении вашего изображения. Полученное по умолчанию серое пятно было помечено как «Элемент управления» в цвете, или в основном цвет фона Windows Form по умолчанию. Измените ваш TransparencyKey на тот, какой у вас серый патч (в моем случае это Control), и ваша проблема будет решена, без необходимости сохранения файлов на жестком диске. Ура, приятель.

0 голосов
/ 14 марта 2009

Можете ли вы просто SetPixel() до Цвет. Прозрачный ? Вместо Color.Lime тогда MakeTransparent? И, как отметили другие; вам нужен формат пикселей с альфа-каналом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...