Mineodo68 Ответов: 1

Залить в Кривой с прозрачным градиентом и сохранить его с#


ОБНОВЛЕНИЕ :
Цитата:
Реализация обязанности и достижения формы разрешения только одного цвета, чтобы использоваться в качестве ключа прозрачности. Невозможно иметь различные уровни прозрачности.



Привет,
На самом деле я работаю с Windows Forms и GDI+.
У меня есть фон с цветом, который я делаю прозрачным, когда позже сохраняю свое изображение в формате png.
Я должен нарисовать несколько полигонов на этом фоне.
Мне также нужно нарисовать замкнутую кривую, заполненную линейной градиентной кистью, переходящей от белого к прозрачному цвету.

Проблема в том, что когда я сохраняю форму в формате png, градиентная кисть переходит от белого к темно-серому/черному. Это похоже на то, как если бы я потерял желаемую прозрачность, когда заполняю свою кривую градиентной кистью.

У меня есть что-то вроде этого. :
https://image.noelshack.com/fichiers/2020/37/1/1599462293-transparent.png[^]

Красная часть прозрачна (она без градиентной кисти).

Спасибо за всю помощь, которую вы можете мне оказать.

Что я уже пробовал:

Это моя градиентная кисть :

LinearGradientBrush linGrBrush2 = new LinearGradientBrush(closedCurveRect, Color.FromArgb(94, 94, 94), Color.Transparent, LinearGradientMode.Vertical);


И я пытаюсь заполнить свою замкнутую кривую вот так :
g.FillClosedCurve(linGrBrush2, closedCurve.ToArray(), FillMode.Alternate, tension);


Когда я сохраняю свое изображение, я преобразую свой фон в прозрачный :
bmp1.MakeTransparent(Color.FromArgb(94, 94, 94));
bmp1.Save(filename + ".png", pngEncoder);

Richard Deeming

Первый аргумент к тому, чтобы Color.FromArgb это альфа-значение, поэтому ваша кисть заполняется от "полностью прозрачного серого" до "полностью прозрачного". Я не думаю, что это действительно принесет какую-то пользу.

Mineodo68

Привет,
Извините, я забыл изменить это значение (это было для моего теста). Это без значения Альфа.

Gerry Schmitz

Вы говорите, что используете градиент, который переходит в прозрачный, на прозрачном фоне. В какой момент прозрачность перестает быть прозрачной?

Mineodo68

Да, ты это понял. Часть моего изображения (нарисованного без градиентной кисти) прозрачна. Но вся часть с градиентной кистью не прозрачна...

Mineodo68

Я просто загрузил картинку для иллюстрации.

Gerry Schmitz

То, что вы хотите, вероятно, возможно, но это зависит от программы / фреймворка. Краска.Сеть хорошо справляется с прозрачностью, а MS Paint-нет. Немного повозился.

https://stackoverflow.com/questions/4988869/how-do-i-set-the-background-colour-of-a-transparent-png-wpf

Mineodo68

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

Gerry Schmitz

Если вы "понимаете градиент", вы должны быть в состоянии выбрать то, что вы хотите; даже если это означает использование определенного цвета в качестве "маски" ... как это делают в кино при замене фона. (Или используйте технику "распыления краски" и сделайте свой собственный градиент)

1 Ответов

Рейтинг:
2

Gerry Schmitz

.net - C# создание градиентного изображения - переполнение стека[^]

Это мод из вышеперечисленного (изменен один из градиентных цветов и тип файла). Суть в том, что вы можете сохранить прозрачный градиент; вам просто нужно больше думать о том, как вы применяете свои другие артефакты.

Bitmap bitmap = new Bitmap( 100, 100 ); // 100x100 pixels
         Graphics graphics = Graphics.FromImage( bitmap );

         System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(
            new System.Drawing.Rectangle( 0, 0, 100, 100 ),
            System.Drawing.Color.Blue,
            System.Drawing.Color.Transparent,
            LinearGradientMode.Vertical );

         brush.SetSigmaBellShape( 0.5f );

         graphics.FillRectangle( brush, new System.Drawing.Rectangle( 0, 0, 100, 100 ) );
         bitmap.Save( "gradientImage.png", ImageFormat.Png );

         bitmap.Dispose();
         graphics.Dispose();
         brush.Dispose();


Mineodo68

Поэтому я попытался сделать то, что вы только что написали (и спасибо за вашу помощь).
Дело в том, что он работает, когда он находится в моей форме windows. Но когда я сохраняю его в формате PNG, он просто больше не работает...

Вот что у меня есть : https://image.noelshack.com/fichiers/2020/37/3/1599636187-transparent2.png

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

Mineodo68

Ладно я просто кое что нашел :
"Реализация обязанности и достижения формы разрешения только одного цвета, чтобы использоваться в качестве ключа прозрачности. Невозможно иметь различные уровни прозрачности."

Так что, возможно, это невозможно в windows Forms. Но спасибо, что помог Джерри !

Gerry Schmitz

Я запустил тот же код из оконной формы, и он работает нормально (я полагал, что так и будет). Я думаю, вы пропустили тот момент, когда я сказал, что вы делаете градиент "сначала", а затем применяете ("вставляете") свои артефакты ("поверх" градиента в тех областях, которые вы хотите изменить). Если вы продолжаете пытаться применить градиент ко всему, это, очевидно, не работает.