65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 GDI+ 实现图像玻璃桌面效果(反射)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (23投票s)

2008年2月28日

CPOL

2分钟阅读

viewsIcon

82028

downloadIcon

2632

本文介绍了一种使用 GDI+ 实现玻璃桌面效果的简单算法。

GlassTableGDI_src

引言

最近,在编写一个电子商务 Web 应用程序时,我需要以某种“专业”的方式转换产品的图像,所以我决定为每个产品图像添加一个众所周知的玻璃效果桌面。由于我囊中羞涩,无法负担请艺术家修改每张图像,所以我决定编写一个简单的算法,使用 GDI+ 自动完成此操作。

这篇文章更像是一个代码片段,供您在应用程序或网站中执行相同操作使用。它简单但实用!

使用代码

要转换图像,只需使用助手的静态方法,如下所示

Image newImage = ImageEffectsHelper.DrawReflection(pOriginal.Image, Color.White, 90);

此方法参数相当清晰明了,但为了起见,还是列出如下

  • Image – 这是您想要制作反射效果的原始图像。
  • BackgroundColor – 图像的背景颜色,用于使用渐变画笔绘制反射效果。
  • Reflectivity – 从 0 到 255,它是图像的反射率(渐变画笔的 Alpha 值)。

示例

我准备了一个小型示例项目,包含两个 Windows 窗体,因此您可以选择要处理的图像并预览处理后的图像。

original.png

算法

现在,算法本身;它根据所需的 Reflectivity 计算新图像的高度。之后,它创建一个新的图形缓冲区,将原始图像绘制到该缓冲区上,然后在第二个图形缓冲区上绘制反射图像,然后翻转它。最后,它简单地合并这两个图像,并使用渐变画笔(具有给定的 Alpha 值和 BackgroundColor)应用到图像上。以下是代码

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;
}

关注点

本文中介绍的算法非常简单。如果您正在寻找更高级(但不太自动)的算法,请尝试以下算法

历史

  • 2008/02/28 – 初始发布。
© . All rights reserved.