C # GDI + - удалить чуть выше нижней половины эллипса по методу глянца

У меня есть метод глянца, и я пытаюсь получить эффект перевернутого полумесяца. В приведенном ниже коде я хотел бы удалить чуть выше нижней половины этого эллипса, а затем нарисовать его. Кто-нибудь знает, как я могу начать это делать?

PS. Глянец тоже получается слишком белым. Я пытался возиться с альфой безрезультатно, кто-нибудь знает какие-нибудь хитрости, чтобы сделать блеск более тонким? Спасибо

  /// <summary>
        /// Applies gloss to clock
        /// </summary>
        /// <param name="e"></param>
        private void DrawGloss(PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            float x = ((float)_CenterX / 1.1F) / _PI;
            float y = ((float)_CenterY / 1.2F) / _PI;
            float width = ((this.ClientSize.Width / 2)) + _hourLength;
            float height = ((this.ClientSize.Height / 2)) + _hourLength;

            RectangleF glossRect = new RectangleF(
           x + (float)(width * 0.10),
           y + (float)(height * 0.07),
           (float)(width * .8),
           (float)(height * 0.4));


            LinearGradientBrush gradientBrush =
                new LinearGradientBrush(glossRect,
                Color.FromArgb((int)50, Color.Transparent),
                glossColor,
                LinearGradientMode.BackwardDiagonal);
            g.FillEllipse(gradientBrush, glossRect);


        }

person stormist    schedule 15.09.2009    source источник


Ответы (1)


FillPie может дать вам ровно половину круга. В противном случае вам придется использовать FillClosedCurve или FillPath, чтобы получить чуть меньше половины круга, или нарисовать полукруг на промежуточном, немного меньшем растровом изображении и скопировать его обратно на основное растровое изображение с помощью DrawImage.

Для более тонкого эффекта блеска, я думаю, вам просто нужно изменить код LinearGradientBrush на:

LinearGradientBrush gradientBrush =                
    new LinearGradientBrush(glossRect,                
    Color.Transparent,                
    Color.FromArgb((int)50, glossColor),                
    LinearGradientMode.BackwardDiagonal);

Ваш исходный градиент переходил от полностью прозрачного к полному глянцевому цвету.

person MusiGenesis    schedule 15.09.2009
comment
+1, а FillPath — самый сложный (и самый мощный) подход. См. msdn.microsoft.com/en-us/library/b5hek5ky.aspx - person Henk Holterman; 15.09.2009
comment
Теперь блеск кажется настолько тонким, что его практически нет. :( Интересно, нет ли золотой середины? Всем спасибо за ответы! - person stormist; 16.09.2009
comment
@stormist: попробуйте увеличить число в параметре Color.FromArgb((int)50, glossColor) с 50 до 128 (или около того). Это число представляет собой значение альфа-канала (или непрозрачность) цвета, полученного из glossColor, и может варьироваться от 0 (полностью прозрачный) до 255 (полностью непрозрачный или равный glossColor). Значение 128 было бы буквально золотой серединой. - person MusiGenesis; 16.09.2009
comment
@stormist: и вы можете поблагодарить меня, нажав на эту маленькую галочку рядом с моим ответом. :) - person MusiGenesis; 16.09.2009
comment
Я забыл упомянуть еще один полезный прием: установите для свойства SmoothingMode вашего объекта Graphics значение HighQuality перед вызовом FillPie (или любых других методов рисования, которые вы используете). Режим по умолчанию пиксельный и в целом довольно дрянной. - person MusiGenesis; 16.09.2009