博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
任意不规则形状的图片剪裁 .
阅读量:6592 次
发布时间:2019-06-24

本文共 2601 字,大约阅读时间需要 8 分钟。

原理:根据选择的区域(区域的选择需要用到GraphicsPath),根据区域可以得到这部分区域的边境矩形,从而不需要循环整张图片,只需要循环边境矩形,将矩形中的选择区域复制到另一种图片,这样大大提高了效率。根据选择的区域,可以得到复制出位于GraphicsPath中的这部分图片,同时设置这部分图片为透明,同时还要设置另一种图片不在GraphicsPath内的区域为透明,这样看起来的效果就是从图片中扣出来的一样,意思和PhotoShop的套索工具差不多。

说得有点晕了,还是看效果图吧:(左边是剪裁出来的图)

下面说说关键的代码。

方法一:像素级的处理,循环整张图片,一个一个像素复制出来,效率比较低。

View Code

方法二:指针法,效率得到提升。

///          /// 剪裁选定区域的图片         ///          /// 原图         /// 用户选定的区域         /// 剪裁出来的图(输出图)         /// 
public static Bitmap BitmapCrop(Bitmap bitmap, GraphicsPath path, out Bitmap outputBitmap) {
Rectangle rect = Rectangle.Round(path.GetBounds()); outputBitmap = new Bitmap(rect.Width, rect.Height); if (bitmap == null) return null; Bitmap bmp = (Bitmap)bitmap.Clone(); bitmap.Dispose(); BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat); BitmapData outData = outputBitmap.LockBits(new Rectangle(0, 0, rect.Width, rect.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); unsafe {
byte* q = (byte*)outData.Scan0; int offset = outData.Stride - rect.Width * 4; int PixelSize = 4; for (int y = rect.Top; y < rect.Top + rect.Height; y++) {
//每一行内存中的位置 byte* row = (byte*)data.Scan0 + ((y - rect.Top) * data.Stride); for (int x = rect.Left; x < rect.Left + rect.Width; x++) {
//判断坐标点是否在路径中 //在路径中,则复制原图这部分给输出图,同时设置原图这部分透明 //坐标点和内存中值的对应 if (path.IsVisible(x, y)) {
q[0] = row[(x - rect.Left) * PixelSize]; q[1] = row[(x - rect.Left) * PixelSize + 1]; q[2] = row[(x - rect.Left) * PixelSize + 2]; q[3] = row[(x - rect.Left) * PixelSize + 3]; row[(x - rect.Left) * PixelSize + 3] = 0; } else //不在路径中,则设置输出图这部分为透明 {
q[3] = 0; } q += 4; } q += offset; } } bmp.UnlockBits(data); outputBitmap.UnlockBits(outData); return bmp; }
 

注意:因为有不安全代码,所以要设置项目的属性 ->生成,勾选允许不安全代码。

转载地址:http://podio.baihongyu.com/

你可能感兴趣的文章
一行命令获取当前JVM所有可设置的参数以及当前默认值
查看>>
spring与struts2 mvc共存web.xml简单配置
查看>>
Python web爬虫
查看>>
详解性能调优命令
查看>>
Linux mint 14下的powerDNS+mysql+powerAdmin搭建个性DNS域名解析服务器
查看>>
Red Hat EnterPrise Linux 5.4下web服务器的综合使用(普通站点、虚拟主机、安全性、...
查看>>
squirrelmail+change_sqlpass 认证 问题
查看>>
hive优化--增加减少map数
查看>>
ERP计划参数如何在线更新
查看>>
LVS+Keepalived实现高可用集群
查看>>
我的友情链接
查看>>
unbantu安装 mysql --- 百度云
查看>>
sql2008性能计数器注册表配置单元一致性失败
查看>>
LNMP环境搭建
查看>>
我的友情链接
查看>>
学习linux—— 磁盘相关指令
查看>>
词法分析与语法分析简介
查看>>
JS中的默认行为
查看>>
我的友情链接
查看>>
Checkio代码闯关小计
查看>>