Создать изображение с некоторыми прозрачными частями

StackOverflow https://stackoverflow.com/questions/644519

  •  22-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать небольшой квадрат 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;
}

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

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

Майкл

ОБНОВЛЯТЬ:Я обновил сценарий, установив для параметра 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;
}
Это было полезно?

Решение

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

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

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

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

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

И последнее замечание: я создаю объект Bitmap только с шириной и высотой, я не указываю формат пикселей или что-то еще, что называется, т.е.растровое изображение = Новое растровое изображение (ширина, высота);

Другие советы

[...]Format16bppRgb555

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top