silverlight:如何在图片上挖个洞?
时间:2022-04-23
本文章向大家介绍silverlight:如何在图片上挖个洞?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、不写代码的方法:用Blend
看图说话:
这是待处理的图片win7
在win7上,画一个矩形,再用钢笔随便画个封闭的path
将矩形与path合并组成复杂的路径
将合成后的复杂路径与win7图片同时选中,然后生成剪切路径
这样我们就得到了一个不规则的图片轮廓(当然这里演示的去掉不规则部分,反过来就是挖洞)
二、用代码挖洞
原理:先用WriteableBitmap把原图片复制一份,然后将原图隐藏,接下来把指定区域的象素透明度指定为0
代码:
xaml部分
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="Mark.Index"
d:DesignWidth="400" d:DesignHeight="250" Width="400" Height="250" >
<Grid x:Name="LayoutRoot">
<Image x:Name="win7" Source="img/win7.jpg" Width="400" Height="250" d:IsHidden="True"/>
<Image x:Name="imgMask" d:IsHidden="True" ></Image>
</Grid>
</UserControl>
后端cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace Mark
{
public partial class Index : UserControl
{
public Index()
{
// Required to initialize variables
InitializeComponent();
this.Loaded += new RoutedEventHandler(Index_Loaded);
}
void Index_Loaded(object sender, RoutedEventArgs e)
{
WriteableBitmap wb = new WriteableBitmap(win7, null);
this.imgMask.Source = wb;
win7.Visibility = Visibility.Collapsed;
GenMask(wb);
}
void GenMask(WriteableBitmap wb)
{
int _width = (int)win7.Width;
int _height = (int)win7.Height;
#region 把四周边距50px以内的区域挖空
int _padding = 50;
for (int row = _padding + 1; row < _height - _padding; row++)
{
for (int i = _width * row + _padding; i < _width * (row+1) - _padding; i++)
{
wb.Pixels[i] = BitConverter.ToInt32(new byte[] { 0, 0, 0, 0 }, 0);//注意顺序:byte数组的含义依次为 {b,g,r,a},即:{蓝,绿,红,透明度}
}
}
#endregion
}
}
}
效果:
利用这个还能玩点花样(在指定区域添加白色噪点):
将鼠标所到之处挖空,即擦除效果:
最后再补充一点位图象素的常识:
bitmap中的pixel是以int32整形数组形式存放的,数组的长度等于 图片的宽度 * 图片的高度,数组每个元素拆分成byte[]后,有4个分量,即r,g,b,a - 红,绿,蓝,透明度,所以我们如果想将图片反色(比如红车换成绿车)的话,只要交换 相应的分量即可。
- http加速器Varnish的vcl配置小记(lnmp环境)
- 关于网站图标favicon.ico那点事儿,你造吗?
- 跨平台 ListView 性能优化
- 打造“微信小程序”组件化开发框架
- 解决Linux下MySQL启动错误Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
- 美团大众点评 Hybrid 化建设
- Linux系统date命令无法修改或同步时间的解决办法
- Redex 初探与 Interdex:Andorid 冷启动优化
- JS延时判断,改善中国博客联盟展示导航自动点击的灵敏度
- RecyclerView 必知必会
- Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点
- Android ImageView 正确使用姿势
- Go语言Goroutine与Channel内存模型
- Tile:一个崭新出炉的机器学习语言
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法