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

本文主要是介绍【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

这篇关于【SkiaSharp绘图05】SKPaint详解(三)之ImageFilter(颜色、组合、膨胀、移位、光照、反射、阴影、腐蚀、变换)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073094

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input