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

news2024/11/24 10:46:40

文章目录

  • 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 width
    paint.TextSize = 100;
    paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");

    float textWidth = paint.MeasureText(TEXT);
    paint.TextSize *= 0.9f * info.Width / textWidth;

    // Find coordinates to center text
    SKRect 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 filter
    paint.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 width
    paint.TextSize = 100;
    paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");

    float textWidth = paint.MeasureText(TEXT);
    paint.TextSize *= 0.9f * info.Width / textWidth;

    // Find coordinates to center text
    SKRect 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 width
    paint.TextSize = 100;
    paint.Typeface = SKTypeface.FromFamilyName("微软雅黑");

    float textWidth = paint.MeasureText(TEXT);
    paint.TextSize *= 0.9f * info.Width / textWidth;

    // Find coordinates to center text
    SKRect 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.coloradmin.cn/o/1835831.html

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

相关文章

大模型基础知识:探索人工智能的巨轮

人工智能大模型,这个在近年来频繁出现在科技新闻和学术论坛的热门词汇,已经成为了推动人工智能技术发展的关键力量。这些大模型,如OpenAI的GPT-3、谷歌的BERT、百度的ERNIE等,以其强大的性能和广泛的应用范围,引起了广…

【STM32】GPIO简介

1.GPIO简介 GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 STM32芯片的GPIO被分成很多组,每组有16个引脚。 最基本的输出…

Flutter 小技巧之面试题里有意思的异步问题

很久没更新小技巧系列了,本次简单介绍一下 Flutter 面试里我认为比较有意思的异步基础知识点。 首先我们简单看一段代码,如下代码所示,是一个循环定时器任务,这段代码里: testFunc 循环每 1 秒执行一次 asyncWorkasy…

缓存技术实战[一文讲透!](Redis、Ecache等常用缓存原理介绍及实战)

目录 文章目录 目录缓存简介工作原理缓存分类1.按照技术层次分类2.按照应用场景分类3.按照缓存策略分类 应用场景1.硬件缓存2.软件缓存数据库缓存Web开发应用层缓存 3.分布式缓存4.微服务架构5.移动端应用6.大数据处理7.游戏开发 缓存优点缓存带来的问题 常见常用Java缓存技术1…

npm install cnpm -g 报错4048

npm install cnpm -g 报错4048 设置淘宝镜像: 报错如下: 其他博主提供的方法都尝试了,比如管理员权限打开终端,删除.npmrc文件,清除缓存npm cache clean -f等都试了无效,最后怀疑是npm和cnpm版本不对应&…

环境搭建---单机k8s

配置基础环境 关闭防火墙 [rootVM-20-14-centos ~]# systemctl stop firewalld && systemctl disable firewalld关闭selinux [rootVM-20-14-centos ~]# setenforce 0 && sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config禁止s…

JVM性能优化工具及问题排查

jvm性能优化工具 jdk提供给我们了很实用的工具来分析JVM的状态,线程以及配置,这些工具包含于jdk中,并且以java实现,是JVM性能优化必不可少的工具集,这些工具都在$JAVA_HOME/bin下 jps、jinfo、jstack、jmap、jstat基本…

Java 开发实例:Spring Boot+AOP+注解+Redis防重复提交(防抖)

文章目录 1. 环境准备2. 引入依赖3. 配置Redis4. 创建防重复提交注解5. 实现AOP切面6. 创建示例Controller7. 测试8. 进一步优化8.1 自定义异常处理8.2 提升Redis的健壮性 9. 总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨…

AI从云端到边缘:人员入侵检测算法的技术原理和视频监控方案应用

在当今数字化、智能化的时代,安全已成为社会发展的重要基石。特别是在一些关键领域,如公共安全、智能化监管以及智慧园区/社区管理等,确保安全无虞至关重要。而人员入侵检测AI算法作为一种先进的安全技术,正逐渐在这些领域发挥着不…

怎样打印微信文档文件?

在日常生活和工作中,我们经常需要打印微信中的文档文件,无论是工作资料、学习笔记还是其他重要信息。随着科技的发展,我们不再需要前往打印店进行繁琐的操作,而是可以通过一些便捷的在线打印平台轻松实现。今天,我们就…

git 快速将当前目录添加仓储

一、进入目录 git init git add . git commit -m "init" git remote add origin http://192.168.31.104/root/AutoBuildDemo.git 二、登录gitlab,创建项目AutoBuildDemo 最后执行: git push -u origin master

【C语言】--- 常见调试信息预处理器宏

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【C语言】--- 常见调试信息预处理器宏 开…

如何用Java SE数组实现高速的数字转换功能

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

技术分析:开源大模型的兴起与热门项目推荐

技术分析:开源大模型的兴起与热门项目推荐 引言 随着人工智能(AI)技术的不断发展,开源大模型成为了许多程序员和研究人员关注的焦点。开源项目不仅促进了技术的快速迭代和普及,还为更多的人提供了学习和实践的机会。…

推荐常用的三款源代码防泄密软件

三款源代码防泄密软件——安秉源代码加密、Virbox Protector 和 MapoLicensor——确实各自在源代码保护的不同方面有其专长。这些软件可以满足企业对于源代码保护的三大需求:防止泄露、防止反编译和防止破解。 安秉源代码加密: 专注于源代码文件的加密&…

惊艳视觉!7个让你大开眼界的数据可视化案例

数据可视化是指通过视觉呈现信息的一种方式,它仍处于不断演变的过程中。许多企业、政府和其他组织都使用数据可视化分析来寻求保持竞争优势。在界面设计中,数据可视化也呈现出越来越流行的趋势,学习数据可视化也是设计师保持竞争优势的一种方…

进程间通信以及线程的同步互斥机制

1.进程间通信机制 常用的六种通信机制: 管道、消息队列、共享内存、信号灯集、信号、Socket 管道(Pipe)和无名管道(匿名管道): 管道是一种半双工的通信方式,数据只能单向流动,通常…

AI在医学中神奇应用

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5,将人工智能的发展推向了一个新的高度。2023年11月7日,OpenAI首届开发者大会被称为“科技界的春晚”,吸引了全球广大…

前端菜鸡学习日记 -- 关于pnpm

哈咯哇大家,我又来了,最近稍微悠闲一些,所以就趁着这个机会学习一些新的知识,今天就是碰巧遇到了pnm,这个可以看作是npm的升级版本,比npm要快,用起来也更得劲更迅速 官网地址:https…

jupyter使用的一个奇怪bug——SyntaxError: invalid non-printable character U+00A0

bug来由:从其他部分例如kaggle里复制来的代码直接粘贴在jupyter notebook里,每一行代码都会出现: Cell In[5], line 1 warnings.filterwarnings(ignore) ^ SyntaxError: invalid non-printable character U00A0 单元格 In[5],第 …