Как создать простой стеклянный эффект - PullRequest
0 голосов
/ 13 июля 2010

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

Я думал, что некоторые стеклянные полосы, например, в дополнение к синей прозрачности, дадут хороший эффект.

Я гуглил алгоритмы GDI + (и другие), чтобы рисовать простые вещи, подобные этой, но они оказались пустыми. Ссылки на любые (довольно простые) алгоритмы на любом языке приветствуются. Я предпочитаю .NET, но могу разобраться в картине из псевдокода вверх.

Извините, но я также указал, что мне нужно настроить таргетинг на WinXP и использовать .NET версии 2.0 - поэтому невозможно использовать WPF или Vista / Win7.

Ответы [ 3 ]

1 голос
/ 13 июля 2010

Я сам этого не делал, но использовал исходный код codeproject для рендеринга образца ... Попробуйте это:

http://www.codeproject.com/KB/GDI-plus/Image-Glass-Reflection.aspx

public static Image DrawReflection(Image _Image, Color _BackgroundColor, int _Reflectivity)
{
    // Calculate the size of the new image
    int height = (int)(_Image.Height + (_Image.Height * ((float)_Reflectivity / 255)));
    Bitmap newImage = new Bitmap(_Image.Width, height, PixelFormat.Format24bppRgb);
    newImage.SetResolution(_Image.HorizontalResolution, _Image.VerticalResolution);

    using (Graphics graphics = Graphics.FromImage(newImage))
    {
        // Initialize main graphics buffer
        graphics.Clear(_BackgroundColor);
        graphics.DrawImage(_Image, new Point(0, 0));
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        Rectangle destinationRectangle = new Rectangle(0, _Image.Size.Height, 
                                         _Image.Size.Width, _Image.Size.Height);

        // Prepare the reflected image
        int reflectionHeight = (_Image.Height * _Reflectivity) / 255;
        Image reflectedImage = new Bitmap(_Image.Width, reflectionHeight);

        // Draw just the reflection on a second graphics buffer
        using (Graphics gReflection = Graphics.FromImage(reflectedImage))
        {
            gReflection.DrawImage(_Image, 
               new Rectangle(0, 0, reflectedImage.Width, reflectedImage.Height),
               0, _Image.Height - reflectedImage.Height, reflectedImage.Width, 
               reflectedImage.Height, GraphicsUnit.Pixel);
        }
        reflectedImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
        Rectangle imageRectangle = 
            new Rectangle(destinationRectangle.X, destinationRectangle.Y,
            destinationRectangle.Width, 
            (destinationRectangle.Height * _Reflectivity) / 255);

        // Draw the image on the original graphics
        graphics.DrawImage(reflectedImage, imageRectangle);

        // Finish the reflection using a gradiend brush
        LinearGradientBrush brush = new LinearGradientBrush(imageRectangle,
               Color.FromArgb(255 - _Reflectivity, _BackgroundColor),
                _BackgroundColor, 90, false);
        graphics.FillRectangle(brush, imageRectangle);
    }

    return newImage;
}
1 голос
/ 28 июля 2010

Мне действительно удалось добиться базового эффекта стекла, наложив мое изображение на прямоугольник размером примерно одну треть с размером изображения ниже, который содержит градиентную заливку белого цвета, которая начинается с непрозрачности 25% и достигает непрозрачности 75%. Это единственный кусочек живописи, создающий стеклянную «полоску», которой я был доволен. Одну и ту же идею можно повторить несколько раз с различными ширинами прямоугольника, чтобы получить несколько «полос», которые создадут иллюзию наложения стекла.

0 голосов
/ 13 июля 2010

Вы можете попробовать функцию Aero Glass, если вы используете Vista или Windows 7.

Это может быть полезно:

http://msdn.microsoft.com/en-us/library/aa969537%28VS.85%29.aspx#blurbehind http://msdn.microsoft.com/en-us/library/ms748975.aspx

...