【SkiaSharp绘图05】SKPaint详解(三)之ImageFilter(颜色、组合、膨胀、移位、光照、反射、阴影、腐蚀、变换)

文章目录

  • ImageFilter
    • CreateColorFilter 颜色滤镜
    • CreateCompose 滤镜组合
    • CreateDilate 膨胀滤镜
    • CreateDisplacementMapEffect 移位映射
    • CreateDistantLitDiffuse 光照
    • CreateDistantLitSpecular 反射光照
    • CreateDropShadow阴影效果
    • CreateDropShadowOnly 只阴影效果
    • CreateErode腐蚀效果
    • CreateMatrix变换矩阵

ImageFilter

CreateColorFilter 颜色滤镜

public static SkiaSharp.SKImageFilter CreateColorFilter (SkiaSharp.SKColorFilter cf, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

SKImageFilter.CreateColorFilter 的主要作用是根据指定的颜色滤镜,对图像进行颜色调整。它的意义在于能够灵活地对图像进行颜色处理,提供了强大的工具来实现各种颜色效果。常见的颜色滤镜包括灰度滤镜、色相/饱和度/亮度调整滤镜等。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);if (skBmp == null) skBmp = SKBitmap.Decode(@"Images\AIWoman.png");// 创建一个灰度颜色滤镜
var colorFilter = SKColorFilter.CreateColorMatrix(new float[]
{0.299f, 0.587f, 0.114f, 0, 0,0.299f, 0.587f, 0.114f, 0, 0,0.299f, 0.587f, 0.114f, 0, 0,0, 0, 0, 1, 0
});
using (var colorFilterImageFilter = SKImageFilter.CreateColorFilter(colorFilter))
using (var paint = new SKPaint())
{paint.FilterQuality = SKFilterQuality.High;canvas.DrawBitmap(skBmp, new SKRect(10, 10, 400, 400), paint);//原图paint.ImageFilter = colorFilterImageFilter;canvas.DrawBitmap(skBmp, new SKRect(410, 10, 800, 400), paint);//灰色滤镜
}

创建一个灰度滤镜,将图像转为灰度图。
CreateColorFilter

CreateCompose 滤镜组合

public static SkiaSharp.SKImageFilter CreateCompose (SkiaSharp.SKImageFilter outer, SkiaSharp.SKImageFilter inner);

滤镜组合,将应用inner(第二个)滤镜,再应用outer(第一个)滤镜。

CreateDilate 膨胀滤镜

public static SkiaSharp.SKImageFilter CreateDilate (int radiusX, int radiusY, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

SKImageFilter.CreateDilate 是 SkiaSharp 中用于创建膨胀滤镜的方法。膨胀滤镜是一种形态学滤波器,通过扩展图像中亮(或白)区域的边缘,可以增强或扩大这些区域。这在图像处理和计算机视觉中具有多种用途,如增强特定特征、减少噪声等。

CreateDisplacementMapEffect 移位映射

public static SkiaSharp.SKImageFilter CreateDisplacementMapEffect (SkiaSharp.SKColorChannel xChannelSelector, SkiaSharp.SKColorChannel yChannelSelector, float scale, SkiaSharp.SKImageFilter displacement, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

SKImageFilter.CreateDisplacementMapEffect 是 SkiaSharp 中用于创建位移映射效果的方法。位移映射是一种高级图像处理技术,通过使用一个位移图(displacement map)来偏移目标图像中的像素位置,从而产生扭曲、波纹或其他变形效果。

作用与意义

位移映射效果的主要作用和意义包括:

  1. 图像扭曲:可以用来创建各种图像扭曲效果,如波纹、水流、热空气导致的扭曲等。
  2. 变形效果:可以实现复杂的变形效果,通过调整位移图可以实现不同的视觉效果。
  3. 动态效果:在动画中,可以用位移映射来创建动态变形效果,使得图像呈现出更加生动的视觉效果。
[System.ComponentModel.Description("SKPaint.ImageFilter的CreateDilate/CreateDisplacementMapEffect/CreateCompose")]
public void OnPaintSurface05_02(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)
{var canvas = e.Surface.Canvas;canvas.Clear(SKColors.White);if (skBmp == null) skBmp = SKBitmap.Decode(@"Images\AIWoman.png");using (var filter = SKImageFilter.CreateDilate(3F, 3F))using (var paint = new SKPaint()){paint.FilterQuality = SKFilterQuality.High;canvas.DrawBitmap(skBmp, new SKRect(10, 10, 400, 400), paint);//原图paint.ImageFilter = filter;canvas.DrawBitmap(skBmp, new SKRect(410, 10, 800, 400), paint);//// 创建位移映射效果滤镜using (var bmpFilter = SKImageFilter.CreateImage(SKImage.FromBitmap(skBmp)))using (var displacementMapEffect = SKImageFilter.CreateDisplacementMapEffect(SKColorChannel.R, // 使用红色通道作为水平位移SKColorChannel.G, // 使用绿色通道作为垂直位移20.0f, // 缩放系数bmpFilter)){paint.ImageFilter = displacementMapEffect;canvas.DrawBitmap(skBmp, new SKRect(10, 410, 400, 800), paint);//using(var composeFilter=SKImageFilter.CreateCompose(filter, displacementMapEffect)){paint.ImageFilter = composeFilter;canvas.DrawBitmap(skBmp, new SKRect(410, 410, 800, 800), paint);//}}paint.ImageFilter = null;paint.Color = SKColors.Red;paint.TextSize = 24;paint.Typeface = SKTypeface.FromFamilyName("宋体");canvas.DrawText($"原图", 20, 200, paint);canvas.DrawText($"CreateDilate", 420, 200, paint);canvas.DrawText($"CreateDisplacementMapEffect", 20, 600, paint);canvas.DrawText($"CreateCompose", 420, 600, paint);}
}

示例膨胀、移位映射效果、组合滤镜。
ImageFilter

CreateDistantLitDiffuse 光照

public static SkiaSharp.SKImageFilter CreateDistantLitDiffuse (SkiaSharp.SKPoint3 direction, SkiaSharp.SKColor lightColor, float surfaceScale, float kd, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

SKImageFilter.CreateDistantLitDiffuse 用于创建一种特定光照效果的滤镜方法。它模拟的是远距离光源照射在图像上的漫反射效果。这种效果可以用来模拟三维物体在光照下的阴影和高光,从而增加图像的立体感和真实感。

** 作用与意义**

  1. 增加立体感:通过模拟光源的照射,图像可以呈现出类似于三维物体的效果,增加深度感。
  2. 增强真实感:光照效果可以使图像看起来更真实,因为现实世界中的物体都是受到光源影响的。
  3. 图像处理与特效:可以在图像处理、游戏开发、UI设计等领域应用,增加视觉效果。
var canvas = e.Surface.Canvas;
var info = e.Info;canvas.Clear();
const string TEXT = "SkiaSharp绘图";
float z = 2F;
float surfaceScale = 1F;
float lightConstant = 0.3F;
// 应用远距离漫反射照明过滤器
using (SKPaint paint = new SKPaint())
{paint.IsAntialias = true;// Size text to 90% of canvas widthpaint.TextSize = 100;paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");float textWidth = paint.MeasureText(TEXT);paint.TextSize *= 0.9f * info.Width / textWidth;// Find coordinates to center textSKRect textBounds = new SKRect();paint.MeasureText(TEXT, ref textBounds);float xText = info.Rect.MidX - textBounds.MidX;float yText = info.Rect.MidY - textBounds.MidY;// Create distant light image filterpaint.ImageFilter = SKImageFilter.CreateDistantLitDiffuse(new SKPoint3(2, 3, z),SKColors.White,surfaceScale,lightConstant);canvas.DrawText(TEXT, xText, yText, paint);
}

CreateDistantLitDiffuse

CreateDistantLitSpecular 反射光照

public static SkiaSharp.SKImageFilter CreateDistantLitSpecular (SkiaSharp.SKPoint3 direction, SkiaSharp.SKColor lightColor, float surfaceScale, float ks, float shininess, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

创建应用远距离镜面反射照明的图像滤镜。
SKImageFilter.CreateDistantLitSpecular 用于创建一种特定光照效果的滤镜方法。它模拟的是远距离光源照射在图像上的镜面反射(高光)效果。这种效果可以用来模拟物体在光照下产生的镜面高光,从而增加图像的真实感和立体感。

作用与意义

  1. 增加真实感和立体感:通过模拟光源的镜面反射效果,图像可以看起来更加真实和立体。
  2. 突出物体表面的细节:镜面反射可以突出物体表面的光滑和凹凸不平。
  3. 图像处理与特效:可以在图像处理、游戏开发、UI设计等领域应用,增加视觉效果。
var canvas = e.Surface.Canvas;
var info = e.Info;canvas.Clear();
const string TEXT = "SkiaSharp绘图";
float z = 2F;
float surfaceScale = 1F;
float shininess = 0.3F;
float ks = 0.8f; 
using (SKPaint paint = new SKPaint())
{paint.IsAntialias = true;// Size text to 90% of canvas widthpaint.TextSize = 100;paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");float textWidth = paint.MeasureText(TEXT);paint.TextSize *= 0.9f * info.Width / textWidth;// Find coordinates to center textSKRect textBounds = new SKRect();paint.MeasureText(TEXT, ref textBounds);float xText = info.Rect.MidX - textBounds.MidX;float yText = info.Rect.MidY - textBounds.MidY;paint.ImageFilter = SKImageFilter.CreateDistantLitSpecular(new SKPoint3(2, 3, z),SKColors.White,surfaceScale,ks,shininess);canvas.DrawText(TEXT, xText, yText, paint);
}

CreateDistantLitSpecular

CreateDropShadow阴影效果

public static SkiaSharp.SKImageFilter CreateDropShadow (float dx, float dy, float sigmaX, float sigmaY, SkiaSharp.SKColor color, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

创建阴影效果

var canvas = e.Surface.Canvas;
var info = e.Info;canvas.Clear(SKColors.White);
const string TEXT = "SkiaSharp绘图";using (SKPaint paint = new SKPaint())
{paint.IsAntialias = true;// Size text to 90% of canvas widthpaint.TextSize = 100;paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");float textWidth = paint.MeasureText(TEXT);paint.TextSize *= 0.9f * info.Width / textWidth;// Find coordinates to center textSKRect textBounds = new SKRect();paint.MeasureText(TEXT, ref textBounds);float xText = info.Rect.MidX - textBounds.MidX;float yText = info.Rect.MidY - textBounds.MidY;// 创建阴影的颜色SKColor shadowColor = new SKColor(0, 0, 0, 128); // 半透明的黑色阴影paint.ImageFilter = SKImageFilter.CreateDropShadow(6, 10, 2, 2, shadowColor);canvas.DrawText(TEXT, xText, yText, paint);paint.ImageFilter = SKImageFilter.CreateDropShadowOnly(6, 10, 2, 2, shadowColor);canvas.DrawText(TEXT, xText, yText+100, paint);
}

阴影

CreateDropShadowOnly 只阴影效果

public static SkiaSharp.SKImageFilter CreateDropShadowOnly (float dx, float dy, float sigmaX, float sigmaY, SkiaSharp.SKColor color, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

只显示阴影效果,不显示前景。

CreateErode腐蚀效果

public static SkiaSharp.SKImageFilter CreateErode (int radiusX, int radiusY, SkiaSharp.SKImageFilter input = default, SkiaSharp.SKImageFilter.CropRect cropRect = default);

图像腐蚀
CreateErode

CreateMatrix变换矩阵

public static SkiaSharp.SKImageFilter CreateMatrix (SkiaSharp.SKMatrix matrix, SkiaSharp.SKFilterQuality quality, SkiaSharp.SKImageFilter input = default);

用于创建一个矩阵滤镜(Matrix Filter),该滤镜可以应用一个仿射变换(如旋转、缩放、平移)到图像上。这个方法允许开发者通过指定矩阵来改变图像的几何形状和位置。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);if (skBmp == null) skBmp = SKBitmap.Decode(@"Images\AIWoman.png");var destRect = new SKRect(410, 10, 800, 400);
// 创建一个旋转45度的仿射变换矩阵,以图像中心为旋转中心
var matrix = SKMatrix.CreateRotationDegrees(45, (destRect.Left+ destRect.Right)/2F, (destRect.Top+ destRect.Bottom)/2F);
// 创建矩阵滤镜
using (var filter = SKImageFilter.CreateMatrix(matrix, SKFilterQuality.High))
using (var paint = new SKPaint())
{paint.FilterQuality = SKFilterQuality.High;canvas.DrawBitmap(skBmp, new SKRect(10, 10, 400, 400), paint);//原图paint.ImageFilter = filter;canvas.DrawBitmap(skBmp, new SKRect(410, 10, 800, 400), paint);//paint.ImageFilter = null;paint.Color = SKColors.Red;paint.TextSize = 24;paint.Typeface = SKTypeface.FromFamilyName("宋体");canvas.DrawText($"原图", 20, 200, paint);canvas.DrawText($"CreateMatrix", 420, 200, paint);
}

注意旋转中心为目标矩形的中心。
CreateMatrix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python热涨落流体力学求解算法和英伟达人工智能核评估模型

🎯要点 🎯平流扩散简单离散微分算子 | 🎯相场模拟:简单旋节线分解、枝晶凝固的 | 🎯求解二维波动方程,离散化时间导数 🎯英伟达 A100 人工智能核性能评估模型 | 🎯热涨落流体动力学…

【无重复字符的最长子串】

无重复字符的最长字串 一、题目二、解决方法1.暴力解法2.滑动窗口哈希 三、总结1.es6 new set()的用法添加元素add()删除元素delete()判断元素是否存在has 2.滑动窗口和双指针的联系和特点 一、题目 二、解决方法 1.暴力解法 解题思路:使用两层循环逐个生成子字符串…

VMware软件的安装与安装Win10系统

上一篇写了(虚拟机)VMware软件的安装及Ubuntu系统安装,这次续上部分,安装完Ubuntu系统后,又安装了win10,也记录一下。 事前准备好win10镜像文件,可在微软官网下载 入口地址:软件下…

深入学习Java `synchronized` 关键字

深入学习Java synchronized 关键字 synchronized关键字通过确保在同一时间只有一个线程可以执行某个代码块,从而防止多个线程同时访问共享资源时发生数据不一致的问题。 修饰方法 当synchronized用于修饰实例方法时,表示当前实例对象是同步锁。这意味…

全球首个开源类Sora模型大升级,16秒720p画质电影感爆棚!代码和权重全面开源!

目录 01 视频界开源战士 02 深度解码技术 03 打破闭环,开源赋能 潞晨Open-Sora团队刚刚在720p高清文生视频质量和生成时长上实现了突破性进展! 全新升级的Open-Sora不仅支持无缝生成任意风格的高质量短片,更令人惊喜的是,团队选…

【windows|002】WEB服务和域名介绍

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

【算法与设计】期末总结

文章目录 第一章 概述算法与程序时间复杂性求上界 第二章 递归与分治双递归函数——Ackerman函数分治策略大整数乘法两位两位四位x四位 三位x三位两位x六位 第三章 动态规划矩阵连乘基本要素最优子结构子问题重叠 备忘录 第四章 贪心算法活动安排问题基本要素贪心选择性质最优子…

pg表空间和mysql表空间的区别

一、表空间的定义 1、在pg中表空间实际上是为表指定一个存储的目录。并且在创建数据库时可以为数据库指定默认的表空间。创建表和索引时可以指定表空间,这样表和索引就可以存储到表空间对应的目录下了。 在pg中一个库中可以有多个表空间,一个表空间可以…

6月17(信息差)

1.马斯克最新预测:未来不再需要手机 将被脑机芯片替代 当地时间6月17日,马斯克高仿号“Not Elon Musk”发帖称:“你会在你的大脑上安装一个Neuralink接口,让你通过思考来控制你的新X手机吗?”对此,马斯克本…

yolov10--C#接口

一、前言 本章主要讲解yolov10的C#接口,主要是使用微软开发的openvinocsharp工具加载yolov10模型,并做推理。 二、yolov10模型转换 这里为了演示,使用官方yolov10m模型(其他大小的模型同理)做演示,可从下方…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码,而我对于大世界的 scale 很感兴趣,所以就尝试把代码跑起来研究。但是,整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档,但这些文档要么过旧,要么过于详尽&…

【护眼知识】护眼台灯真的有用吗?带你看台灯怎么选对眼睛好

在数字化时代,我们的眼睛无疑承受着前所未有的压力。无论是长时间盯着电脑屏幕,还是沉浸在书本的海洋中,眼睛的健康都成为了我们不容忽视的问题。中国现有约500万盲人,占总人口的0.4%,是世界上盲和视力损伤严重的国家之…

浏览器加速播放视频技巧

当我们看网页中的视频时,想加速播放,但是选项最高只能2倍速时,还想再加快播放如何操作? 此时我们可以按F12打开浏览器开发者选项,然后点击控制台,在浏览器输入如下代码: document.querySelecto…

月薪没到20K,必啃的WebGIS系统技术栈,你练到哪一步了?

WebGIS(网络地理信息系统)是目前地理信息系统(GIS)开发的主流,它利用互联网技术来发布、共享和交互地理空间数据。 一个完整的WebGIS项目通常涉及以下几个主要环节:具备一定的理论知识,数据生产…

MAGs培养有线索了?宏组学中未培养微生物表型与培养条件预测

宏基因组测序技术让人们对地球上微生物的多样性有了更深入的了解,但分离培养是研究微生物的生理代谢功能并解析其生态作用的关键。2023年11月的世界微生物数据中心(WDCM)年会中,全面启动了全球“未培养微生物培养组”计划&#xf…

毕业回家寄大量衣服裤子省钱技巧分享

很多宝子们问我,怎么寄快递更加便宜划算,特别是当你有很多的衣服裤子这类型的衣物的时候,怎么寄件最便宜。 今天分享几个寄快递的省钱方法以及经验分享。 1、惠发快递 像寄包裹快递,可以找快递平台进行下单,这样会更…

【机器学习300问】124、什么是LSTM?LSTM的基本结构是怎样的?

长短期记忆网络(LSTM)是一种解决隐变量模型长期信息保存和短期输入缺失问题的方法,有趣的是,长短期记忆网络的设计比门控循环单元稍微复杂一些, 却比门控循环单元早诞生了近20年。 一、什么是LSTM? LSMT全…

M41T00串行实时时钟-国产兼容RS4C1339

RS4C1340是一种实时时钟(RTC)/日历,与ST M41T00引脚兼容,功能等效,包括软件时钟校准。该器件还提供VBAT引脚上的涓流充电能力、较低的计时电压和振荡器STOP标志。寄存器映射的块访问与ST设备相同。涓流充电器和标志需要…

vue+springboot导入Excel表格

1.创建一个excel表格,与数据库需要的表头对应 2.(前端)导入excel的按钮 <template class"importExcel"><el-button type"primary" click"chooseFile">导入<i class"el-icon-upload el-icon--right"></i><…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…