C#使用Effects给图片增加阴影效果
作者:天方 发布时间:2023-09-09 14:50:18
标签:C#,Effects,图片,增加,阴影,效果
今天写一个小程序有一个给图片加上阴影的需求,记得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;
主要是如下几步:
在DrawingContext中绘图
通过DrawingVisual将DrawingContext转换为Visual
通过RenderTargetBitmap将Visual转换为BitmapFrame
通过xxxBitmapEncoder将BitmapFrame保存为图像
这些步骤也无需严格遵守,像我最开始的那个例子则是直接生成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);
}
来源:https://www.cnblogs.com/TianFang/archive/2010/10/23/1859497.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- SpringDataJpa创建中间表//fetch=FetchType.EAGER 关闭懒加载 相当于hibernate中的lazy=fal
- 目录前言Binder的使用模糊进程间调用Binder原理ioctlbinder初始化总结前言Binder是安卓中实现IPC(进程间通信的)常
- 一、加密方案介绍对接口的加密解密操作主要有下面两种方式:自定义消息转换器优势:仅需实现接口,配置简单。劣势:仅能对同一类型的MediaTyp
- 从不规则的字符串中截取出日期最近在项目中需要远程调接口,从String字符串中截取出日期,想了好久,最后用java8新特性,解决了,java
- 今天写项目突然出现了无法启动Gradle的bug,如下图然后就看了log日志:这个问题是我第一次看见,然后就开始了各种百度,有说需要在And
- JSONObject 与 JSONArray区别JSONObject:{"area": "武汉",&
- 错误处理到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以
- 本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下第一种方式:package com.cloudpowe
- 实现代码超简单,具体实现方法如下:有时候当我们的游戏人物遇敌时,我们需我怪物随机根据概率选择处理方式,如下:1、50%的机会友好的问候2、2
- java事件机制中包含下述三要素:1、事件,发生了什么事,比如用户在界面上的一个操作(手势滑动屏幕),当一个事件发生的时候,该事件用一个事件
- 前言:最近在工程中需要用到截取RotatedRect中的图形,保存为Mat做后续处理。发现opencv文档中没有这个api,最开始想到的方案
- 从上一节的小demo中我们搞清楚了如何跟易宝对接以及易宝的支付流程。这一节我们来做一下支付页面以及在页面中导入银行图标。1. 存储银行图标银
- 一、下载Unity首先去官网下载对应版本的 UnityHubUnity官网地址: https://unity.cn/releases&nbs
- 一、什么是iText?在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Js
- using System;using System.Collections.Generic;using System.Net;using S
- Android getevent用法实例详解最近在测试设备按键的常用命令,感觉这些命令都有的,但就是不知道怎么查找。翻阅了几篇博
- 整理文档,搜刮出一个C# 通过 oledb 操作Excel实例代码,稍微整理精简一下做下分享。public string GetConnec
- 1. 前言Spring最重要的一个概念当属Bean了,我们写的Controller、Service、Dao凡是加了对应注解交给Spring管
- AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dot
- Java 开发语言中实现HTTP请求的方法主要有两种:一种是JAVA的标准类HttpUrlConnection,比较原生的实现方法;另一种是