zoukankan      html  css  js  c++  java
  • 给图片加上阴影效果

    今天写一个小程序有一个给图片加上阴影的需求,记得WPF的Effect中就有阴影特效,就打算用它了。代码如下:

        using (var imageStreamSource = File.OpenRead(@"r:\4.png"))
        using (Stream fs = File.Create(@"r:\test.png"))
        {
            var decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            var bitmapFrame = decoder.Frames[0];

            var size = new Size(bitmapFrame.PixelWidth, bitmapFrame.PixelHeight);
            var img = new Image() { Source = bitmapFrame };
            img.Effect = new System.Windows.Media.Effects.DropShadowEffect();
            img.Arrange(new Rect(0,0,bitmapFrame.PixelWidth,bitmapFrame.PixelHeight));

            var rtb = new RenderTargetBitmap(bitmapFrame.PixelWidth, bitmapFrame.PixelHeight, 96, 96, PixelFormats.Pbgra32);
            rtb.Render(img);
            var png = new PngBitmapEncoder();
            png.Frames.Add(BitmapFrame.Create(rtb));
            png.Save(fs);
        }

    使用过程中,发现WPF和GDI的处理方式还是有有些类似的。它的基本使用方式如下:

        Image myImage = new Image();
        FormattedText text = new FormattedText("ABC",
                new CultureInfo("en-us"),
                FlowDirection.LeftToRight,
                new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.Normal, new FontStretch()),
                this.FontSize,
                this.Foreground);

        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawText(text, new Point(2, 2));
        drawingContext.Close();

        RenderTargetBitmap bmp = new RenderTargetBitmap(180, 180, 120, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);
        myImage.Source = bmp;

     

    主要是如下几步:

    1. DrawingContext中绘图
    2. 通过DrawingVisualDrawingContext转换为Visual
    3. 通过RenderTargetBitmap将Visual转换为BitmapFrame
    4. 通过xxxBitmapEncoderBitmapFrame保存为图像

    这些步骤也无需严格遵守,像我最开始的那个例子则是直接生成Visual,然后保存为图像。其实我更喜欢这种方式,因为Visual是可以直接在WPF的界面上显示出来的,方便调试,并且很方便应用WPF中的各种特效。不过要记得调用一下Arrange函数,否则看不到生成结果的。

    这里再给个更简单的例子,以供学习。

        Ellipse cir = new Ellipse();
        cir.Height = 50;
        cir.Width = 50;
        cir.Stroke = Brushes.Black;
        cir.StrokeThickness = 1.0;
        cir.Arrange(new Rect(new Size(50, 50)));    //


        RenderTargetBitmap rtb = new RenderTargetBitmap(200, 200, 96, 96, PixelFormats.Pbgra32);
        rtb.Render(cir);

        PngBitmapEncoder png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(rtb));
        using (Stream fs = File.Create(@"r:\test.png"))
        {
            png.Save(fs);
        }

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/TianFang/p/1859497.html
Copyright © 2011-2022 走看看