Как создать простой эффект стекла

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

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

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

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


person Paul Sasik    schedule 12.07.2010    source источник
comment
wpf — ваше решение =P jmorrill. hjtcentral.com/Home/tabid/428/EntryId/403/   -  person Luiscencio    schedule 13.07.2010
comment
WPF был бы потрясающим, но я застрял в .NET 2.0.   -  person Paul Sasik    schedule 13.07.2010
comment
так что вам не хватает LINQ и прочее???? бедная грустная душа =(   -  person Luiscencio    schedule 13.07.2010


Ответы (3)


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

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;
}
person Community    schedule 12.07.2010

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

person Paul Sasik    schedule 28.07.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

person Chris Laplante    schedule 12.07.2010
comment
Для этого потребуется отдельное окно для каждого элемента управления, и вам нужно переместить его с помощью базовой формы ... на самом деле звучит не очень хорошо. - person Joey; 13.07.2010
comment
Не совсем так: приложение может применить эффект размытия за всей клиентской областью окна или за определенной субобластью. Это позволяет приложениям добавлять стилизованные пути и панели поиска, которые визуально отделены от остальной части приложения. - person Chris Laplante; 13.07.2010