【SkiaSharp绘图03】SKPaint详解(一)BlendMode混合模式、ColorFilter颜色滤镜

文章目录

  • SKPaint
  • SKPaint属性
    • BlendMode获取或设置混合模式
      • SKBlendMode 枚举成员
      • 效果预览
    • Color/ColorF获取或设置前景色
    • ColorFilter 颜色滤镜
      • CreateBlendMode 混合模式
      • CreateColorMatrix 颜色转换
      • CreateCompose 组合滤镜
      • CreateHighContrast 高对比度滤镜
      • CreateLighting 照明滤镜
      • CreateLumaColor
      • CreateTable 查表
  • 与Window GDI+对比

SKPaint

定义:

public class SKPaint : SkiaSharp.SKObject

构造函数:

public SKPaint ();
public SKPaint (SkiaSharp.SKFont font);

作用:保存有关如何绘制几何图形、文本和位图的样式和颜色等信息。
效果预览:
SKPaint
(本以为,SKPaint只是包含了GDI+的Pen、Brush的功能,可随着深入了解,它隐藏着更多功能,都不知道给它一个怎样的合适中文名称了)

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{
    paint.Typeface = SKTypeface.FromFamilyName("宋体");
    paint.TextSize = 48;
    paint.IsAntialias = true;
    paint.Color = SKColors.Red;
    paint.StrokeWidth = 1;
    paint.Style = SKPaintStyle.Stroke;

    const string text = "SkiaSharp绘图";
    canvas.DrawText(text, 10, 48, paint);
    paint.Color = SKColors.Green;
    paint.Style = SKPaintStyle.Fill;
    canvas.DrawText(text, 10, 90, paint);

    paint.TextScaleX = 1.5f;
    paint.Color = SKColors.Blue;
    canvas.DrawText(text, 10, 160, paint);
}

SKPaint属性

BlendMode获取或设置混合模式

SKBlendMode 是 SkiaSharp 中用于指定颜色混合模式的枚举,它决定了绘制操作如何与已有的颜色混合。不同的混合模式可以用来创建各种视觉效果,如透明度、遮罩、滤镜等。

以下是 SKBlendMode 的详细说明,包括每种混合模式的解释及其效果:

SKBlendMode 枚举成员

  1. Clear: 完全清除目标区域,绘制结果是透明的。

    • 公式: result = 0
    • 效果:目标区域变成透明。
  2. Src: 仅显示源颜色,忽略目标颜色。

    • 公式: result = source
    • 效果:源颜色完全覆盖目标颜色。
  3. Dst: 仅显示目标颜色,忽略源颜色。

    • 公式: result = destination
    • 效果:目标颜色保持不变。
  4. SrcOver: 源颜色在目标颜色上绘制,考虑源颜色的透明度。

    • 公式: result = source + (1 - sourceAlpha) * destination
    • 效果:源颜色在目标颜色上覆盖,源颜色的透明度影响覆盖效果。
  5. DstOver: 目标颜色在源颜色上绘制,考虑目标颜色的透明度。

    • 公式: result = destination + (1 - destinationAlpha) * source
    • 效果:目标颜色在源颜色上覆盖,目标颜色的透明度影响覆盖效果。
  6. SrcIn: 仅显示目标颜色被源颜色裁剪的部分。

    • 公式: result = source * destinationAlpha
    • 效果:源颜色仅在目标颜色不透明的地方绘制。
  7. DstIn: 仅显示源颜色被目标颜色裁剪的部分。

    • 公式: result = destination * sourceAlpha
    • 效果:目标颜色仅在源颜色不透明的地方显示。
  8. SrcOut: 仅显示源颜色不被目标颜色覆盖的部分。

    • 公式: result = source * (1 - destinationAlpha)
    • 效果:源颜色仅在目标颜色透明的地方绘制。
  9. DstOut: 仅显示目标颜色不被源颜色覆盖的部分。

    • 公式: result = destination * (1 - sourceAlpha)
    • 效果:目标颜色仅在源颜色透明的地方显示。
  10. SrcATop: 源颜色在目标颜色上方绘制,仅在目标颜色不透明的地方显示源颜色,目标颜色的透明部分显示目标颜色。

    • 公式: result = source * destinationAlpha + destination * (1 - sourceAlpha)
    • 效果:源颜色在目标颜色上方绘制,目标颜色不透明的部分显示源颜色,透明的部分显示目标颜色。
  11. DstATop: 目标颜色在源颜色上方绘制,仅在源颜色不透明的地方显示目标颜色,源颜色的透明部分显示源颜色。

    • 公式: result = destination * sourceAlpha + source * (1 - destinationAlpha)
    • 效果:目标颜色在源颜色上方绘制,源颜色不透明的部分显示目标颜色,透明的部分显示源颜色。
  12. Xor: 仅显示源颜色和目标颜色中不重叠的部分。

    • 公式: result = source * (1 - destinationAlpha) + destination * (1 - sourceAlpha)
    • 效果:源颜色和目标颜色不重叠的部分显示,重叠部分透明。
  13. Plus: 源颜色和目标颜色相加。

    • 公式: result = min(source + destination, 1)
    • 效果:源颜色和目标颜色相加,颜色值不超过最大值。
  14. Modulate: 源颜色和目标颜色相乘。

    • 公式: result = source * destination
    • 效果:源颜色和目标颜色相乘,创建暗淡效果。
  15. Screen: 反相相乘,然后再反相。

    • 公式: result = 1 - (1 - source) * (1 - destination)
    • 效果:产生浅色、增亮效果。
  16. Overlay: 结合 Multiply 和 Screen,根据目标颜色的亮度进行选择。

    • 公式: result = destination < 0.5 ? 2 * source * destination : 1 - 2 * (1 - source) * (1 - destination)
    • 效果:目标颜色较暗时使用 Multiply,较亮时使用 Screen,增加对比度。
  17. Darken: 显示较暗的颜色。

    • 公式: result = min(source, destination)
    • 效果:显示源颜色和目标颜色中的较暗者。
  18. Lighten: 显示较亮的颜色。

    • 公式: result = max(source, destination)
    • 效果:显示源颜色和目标颜色中的较亮者。
  19. ColorDodge: 放大源颜色,直到它们达到白色。

    • 公式: result = destination / (1 - source)
    • 效果:使颜色变亮。
  20. ColorBurn: 放大目标颜色,直到它们达到黑色。

    • 公式: result = 1 - (1 - destination) / source
    • 效果:使颜色变暗。
  21. HardLight: 结合 Multiply 和 Screen,根据源颜色的亮度进行选择。

    • 公式: result = source < 0.5 ? 2 * source * destination : 1 - 2 * (1 - source) * (1 - destination)
    • 效果:源颜色较暗时使用 Multiply,较亮时使用 Screen,增加对比度。
  22. SoftLight: 柔和地结合源颜色和目标颜色。

    • 公式: result = (1 - destination) * source * destination + destination * source * (1 - source)
    • 效果:柔和地合并颜色,产生轻微增亮或变暗效果。
  23. Difference: 计算源颜色和目标颜色的差异。

    • 公式: result = abs(destination - source)
    • 效果:对比两种颜色的差异。
  24. Exclusion: 类似于 Difference,但对比度较低。

    • 公式: result = destination + source - 2 * destination * source
    • 效果:降低对比度的差异效果。
  25. Multiply: 源颜色和目标颜色相乘,结果颜色较暗。

    • 公式: result = source * destination
    • 效果:颜色相乘,产生较暗的结果。
  26. Hue: 使用源颜色的色调,目标颜色的饱和度和亮度。

    • 公式: result = setHue(source, destination)
    • 效果:混合色调。
  27. Saturation: 使用源颜色的饱和度,目标颜色的色调和亮度。

    • 公式: result = setSaturation(source, destination)
    • 效果:混合饱和度。
  28. Color: 使用源颜色的色调和饱和度,目标颜色的亮度。

    • 公式: result = setColor(source, destination)
    • 效果:混合颜色。
  29. Luminosity: 使用源颜色的亮度,目标颜色的色调和饱和度。

    • 公式: result = setLuminosity(source, destination)
    • 效果:混合亮度。

效果预览

枚举BlendMode的各种值,修改BlendMode属性并绘制。
这里使用图像可能更能体现效果,但目前还是先用文字效果做简单的对比吧。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.LightGreen.WithAlpha(200));
const float textSize = 24;
float lineHeight = textSize + 2;
using (var paint = new SKPaint())
{
    paint.Typeface = SKTypeface.FromFamilyName("宋体");
    paint.TextSize = textSize;
    paint.IsAntialias = true;
    paint.Color = SKColors.Red.WithAlpha(127);
    var blendModes = Enum.GetValues(typeof(SKBlendMode)) as SKBlendMode[];
    var x = 10;
    const string text = "SkiaSharp绘图";
    var offset = paint.MeasureText(text);
    var defaultVal = paint.BlendMode;//SrcOver
    var y = lineHeight;
    foreach (var blendMode in blendModes)
    {
        paint.BlendMode = blendMode;
        canvas.DrawText($"{text}", x, y, paint);
        paint.BlendMode = defaultVal;
        canvas.DrawText($" {blendMode}", x + offset, y, paint);
        y += lineHeight;
    }
}

BlendMode

Color/ColorF获取或设置前景色

定义:

public SkiaSharp.SKColor Color { get; set; }
public SkiaSharp.SKColorF ColorF { get; set; }
  • 32位的ARGB
  • 可通过WithAlpha、WithBlue、WithGreen、WithRed方法修改其中一个通道的值。
    通过ToHsl、ToHsv转成Hsl与Hsv色彩空间值
  • 可通过FromHsl、FromHsv、Parse、TryParse生成SKColor,字符串格式为#AARRGGBB等

ColorFilter 颜色滤镜

定义:

public SkiaSharp.SKColorFilter ColorFilter { get; set; }

作用:获取或设置SKPaint的颜色滤镜。

CreateBlendMode 混合模式

public static SkiaSharp.SKColorFilter CreateBlendMode (SkiaSharp.SKColor c, SkiaSharp.SKBlendMode mode);

作用:创建使用指定颜色和模式的新滤镜。

/// <summary>
/// 绘制三个填充矩形
/// </summary>
/// <param name="canvas"></param>
/// <param name="paint"></param>
/// <param name="y">y轴偏移</param>
/// <param name="text">提示文字</param>
private void DrawByColorFilter(SKCanvas canvas,SKPaint paint,int y,string text)
{
    canvas.DrawText(text, 50, y - 10, paint);
    paint.Color = SKColors.Red;
    canvas.DrawRect(50, y, 200, 100, paint);

    paint.Color = SKColors.Green;
    canvas.DrawRect(300, y, 200, 100, paint);

    paint.Color = SKColors.Blue;
    canvas.DrawRect(550, y, 200, 100, paint);
}
var canvas = e.Surface.Canvas;
var into = e.Info;
canvas.Clear(SKColors.White);

using (var paint = new SKPaint())
{
    paint.TextSize = 18;
    paint.Typeface = SKTypeface.FromFamilyName("宋体");

    var x = 50;
    DrawByColorFilter(canvas, paint, x, $"无滤镜下的颜色");

    // 红色增强
    var redEnhanceFilter = SKColorFilter.CreateBlendMode(SKColors.Red.WithAlpha(127), SKBlendMode.SrcOver);
    paint.ColorFilter = redEnhanceFilter;
    x += 150;
    DrawByColorFilter(canvas, paint, x, $"红色增强滤镜下的颜色");
}

1、定义一个绘制红、绿、蓝三个矩形的函数
2、绘制无滤镜下的三原色矩形
3、创建红色增强滤镜
4、绘制滤镜下的三原色矩形
红色增强滤镜

CreateColorMatrix 颜色转换

public static SkiaSharp.SKColorFilter CreateColorMatrix (float[] matrix);

通过一个4x5的矩阵创建一个颜色滤镜。

    // 转灰度
    var colorMatrix = new float[]
        {
            0.2126f, 0.7152f, 0.0722f, 0, 0,
            0.2126f, 0.7152f, 0.0722f, 0, 0,
            0.2126f, 0.7152f, 0.0722f, 0, 0,
            0,     0,     0,     1, 0
        };
    var grayFilter= SKColorFilter.CreateColorMatrix(colorMatrix);
    paint.ColorFilter = grayFilter;
    x += 150;
    DrawByColorFilter(canvas, paint, x, $"灰度滤镜下的颜色");

1、定义灰度转换矩阵,并创建滤镜
2、绘制应用灰度滤镜后的三原色矩形
灰度滤镜

CreateCompose 组合滤镜

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

生成组合滤镜,先应用内部(后面的)滤镜,再应用外部(前面的)滤镜。

//红色增强+转灰度 组合滤镜
var composeFilter = SKColorFilter.CreateCompose(grayFilter, redEnhanceFilter);
paint.ColorFilter = composeFilter;
x += 150;
DrawByColorFilter(canvas, paint, x, $"红色增强+灰度 组合滤镜下的颜色");

1、组合红色增强与灰度组合的滤镜(注意顺序)
2、绘制应用组合滤镜后的三原色矩形
组合滤镜

CreateHighContrast 高对比度滤镜

public static SkiaSharp.SKColorFilter CreateHighContrast (SkiaSharp.SKHighContrastConfig config);
public static SkiaSharp.SKColorFilter CreateHighContrast (bool grayscale, SkiaSharp.SKHighContrastConfigInvertStyle invertStyle, float contrast);
/// <summary>
/// 绘制提示文字与图像
/// </summary>
/// <param name="bmp"></param>
/// <param name="canvas"></param>
/// <param name="paint"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="text"></param>
private void DrawBmpByColorFilter(SKBitmap bmp,SKCanvas canvas, SKPaint paint,float x,float y, string text)
{
    canvas.DrawText(text, x, y - 10, paint);
    canvas.DrawBitmap(bmp, new SKRect(x, y, x + 380, y + 380), paint);
}
 var canvas = e.Surface.Canvas;
 var into = e.Info;
 canvas.Clear(SKColors.White);

 using (var paint = new SKPaint())
 {
     paint.TextSize = 18;
     paint.Typeface = SKTypeface.FromFamilyName("宋体");

     if(bmp == null)
     {
         bmp = SKBitmap.Decode(@"images\AIwoman.png");
     }
     DrawBmpByColorFilter(bmp, canvas, paint, 20, 30, $"原图");

     var highContrast = SKColorFilter.CreateHighContrast(false, SKHighContrastConfigInvertStyle.NoInvert, 0.5f);
     paint.ColorFilter = highContrast;

     DrawBmpByColorFilter(bmp, canvas, paint, 420, 30, $"高对比度滤镜");
 }

1、绘制原图
2、创建高对比度滤镜
3、应用滤镜后再次绘制原图

其它滤镜

CreateLighting 照明滤镜

public static SkiaSharp.SKColorFilter CreateLighting (SkiaSharp.SKColor mul, SkiaSharp.SKColor add);

将每个像素的RGB通道值,乘第一个颜色,再加第一个颜色,最后结果值范围在[0,255],一般用于调节亮度。

SKColor mul = new SKColor(255, 255, 255); //不改变
SKColor add = new SKColor(50, 50, 50);//调亮
var lightFilter = SKColorFilter.CreateLighting(mul, add);
paint.ColorFilter = lightFilter;
DrawBmpByColorFilter(bmp, canvas, paint, 20, 450, $"Lighting滤镜");

CreateLumaColor

public static SkiaSharp.SKColorFilter CreateLumaColor ();

创建新的亮度至Alpha颜色滤镜。

var lumaFilter = SKColorFilter.CreateLumaColor();
paint.ColorFilter = lumaFilter;
DrawBmpByColorFilter(bmp, canvas, paint, 420, 450, $"Luma滤镜")

CreateTable 查表

public static SkiaSharp.SKColorFilter CreateTable (byte[] table);
public static SkiaSharp.SKColorFilter CreateTable (byte[] tableA, byte[] tableR, byte[] tableG, byte[] tableB);

通过查找表 (LUT) 对每个颜色通道进行映射和转换。它允许你指定每个颜色通道 (红、绿、蓝) 应如何转换。

//创建查找表
byte[] redTable = new byte[256];
byte[] greenTable = new byte[256];
byte[] blueTable = new byte[256];

for (int i = 0; i < 256; i++)
{
    redTable[i] = (byte)(255 - i);  // 红色通道反向
    greenTable[i] = (byte)i;       // 绿色通道不变
    blueTable[i] = (byte)(i + 30 > 255 ? 255 : i + 30); // 蓝色调亮
}

SKColorFilter colorFilter = SKColorFilter.CreateTable(null, redTable, greenTable, blueTable);
paint.ColorFilter = colorFilter;
DrawBmpByColorFilter(bmp, canvas, paint, 820, 30, $"查表法滤镜");

与Window GDI+对比

写到一半,突然后悔从SKPaint开始深入了解了,个人感觉SKPaint的功能包含了Windows GDI+中多个类的功能如:

  1. GDI+ 中的 Pen

    • SKPaint 可以用于绘制几何图形,类似于 Pen 类。
    • 它控制着绘制操作中的笔触样式、颜色、宽度等属性。
  2. GDI+ 中的 Brush

    • SKPaint 用于填充图形,类似于 Brush 类的功能。
    • 它定义了填充的颜色、渐变、图案等属性。
  3. GDI+ 中的 Font

    • SKPaint 也负责文本的绘制,类似于 Font 类。
    • 它定义了文本的字体、大小、样式等属性,并控制文本的绘制效果。
  4. GDI+ 中的 ImageAttributes

    • SKPaint 颜色滤镜,类似于 ImageAttributes 类。
    • 同样可以定义ColorMatrix来使用颜色滤镜

上面这些,也只是目前所了解的,可能还包含了更多GDI+类的功能。所以,一开始就写SKPaint类,都不知道这水会有多深呢!
SkiaSharp绘图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java最新面试题(全网最全、最细、附答案)

一、Java基础 1、基础概念与常识Java 语言有哪些特点? 简单易学&#xff08;语法简单&#xff0c;上手容易&#xff09;&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff08; Java 虚拟机实现平台无关性&a…

千万级流量冲击下,如何保证极致性能

1 简要介绍 随着互联网的快速发展&#xff0c;网络应用的流量规模不断攀升&#xff0c;特别是在电商大促、明星直播、重大赛事、头条热搜等热点事件中&#xff0c;秒级100w请求成为了常态。在这样的流量冲击下&#xff0c;如何确保系统稳定、高效地处理每一个请求&#xff0c;为…

抖某音号解封释放实名

##抖音账号封禁后如何解封呢 我相信&#xff0c;做过抖音&#xff0c;或者正在做抖音的朋友&#xff0c;都曾面临一种尴尬至极的局面&#xff0c;辛辛苦苦做起来的账号&#xff0c;或者刚刚准备好的账号&#xff0c;在一时之间&#xff0c;竟然被抖音官方封禁了&#xff01; 实…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

小而美的算法技巧:前缀和数组

小而美的算法技巧&#xff1a;前缀和数组 类似动态规划。 class NumArray {private int[] preSum;public NumArray(int[] nums) {preSumnew int[nums.length1];//preSum[0]的前缀和为0for(int i1;i<preSum.length;i){preSum[i]nums[i-1]preSum[i-1];//先计算累加和}}publi…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

毕业年薪20w起!25届最近5年南京信息工程大学自动化考研院校分析

南京信息工程大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近4年考研分数情况 四、近4年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、…

掌握WhoisAPI,提升域名管理的效率

在互联网时代&#xff0c;域名管理是网站运营中非常重要的一环。通过域名&#xff0c;我们能够轻松访问和识别不同的网站。然而&#xff0c;域名的注册和管理也是一项复杂的任务&#xff0c;特别是对于大规模拥有许多域名的企业来说。为了提升域名管理的效率&#xff0c;我们可…

边缘计算网关在智慧厕所远程监测与管理的应用

随着智慧城市建设的不断深入&#xff0c;城市公共设施的智慧化管理成为了提升城市品质和居民生活质量的关键建设。公厕作为城市基础设施的重要组成部分&#xff0c;其管理效率和卫生状况直接影响着市民的日常生活体验。在公厕设施建设背景下&#xff0c;边缘计算网关技术的应用…

ansible离线安装docker

docker简介&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。这个容器可以在任何支持Docker的机器上运行&#xff0c;确保了应用在不同环境中的一致性。 网上有很多在线ansible安装docker的&…

Base64编码方式的介绍及其编码解码

一、Base64是什么 Base64是一种用于将二进制数据编码为ASCII字符的编码方式&#xff0c;主要目的是为了能够在文本环境中传输和存储二进制数据。这种编码方式广泛应用于电子邮件、HTTP协议和其他需要传输或存储二进制数据的地方。 二、发明Base64编码的原因 Base64编码的发明解…

猫狗识别(超详细版)(py代码)

猫狗识别&#xff08;一&#xff09; 二、视频识别 用OpenCV和Tkinter构建的视频识别猫狗的应用程序。它允许用户从文件对话框中选择一个视频文件&#xff0c;然后在Tkinter窗口中播放视频&#xff0c;并使用Haar级联分类器实时检测视频中的猫和狗。 1.导入所需的库&#xff…

QT--DAY1

不使用图形化界面实现一个登陆界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("登录界面");//设置窗口大小this->resize(535,410);//固定窗口大小this->setFixedSize(535,410)…

北京多商入驻app开发项目的主要优势及功能

多商入驻app开发项目的定义 随着电子支付技术的不断成熟&#xff0c;全国各地的消费者通过网络在线上购物的频率越来越高&#xff0c;为此&#xff0c;多商入驻app开发项目应用而生。各商家也纷纷开始申请入驻商城平台&#xff0c;开设自己的店铺。 图片来源&#xff1a;unspl…

MAVEN-SNAPSHOT和RELEASE

一、快照版本SNAPSHOT和发布版本RELEASE区别 快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客 在使⽤maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能⼀天就要发布⼀次&#xff0c;遇到bug时&am…

网络编程(三)UDP TFTP协议

文章目录 一、 UDP&#xff08;一&#xff09;概述&#xff08;二&#xff09;流程 二、收发函数&#xff08;一&#xff09;recvfrom&#xff08;二&#xff09;sendto 三、实现一个简单的udp服务端和客户端四、实现tftp客户端协议 一、 UDP &#xff08;一&#xff09;概述 …

vue 中多个表单元素控一个校验规则

1. 场景一 <el-form-itemlabel"确认时长方式"prop"preSubResourceDurationDay" ><div class"confirmDurationDay">最晚使用日期前<el-input-numberv-model"form.preSubResourceDurationDay":precision"0"cla…

为什么需要负样本

假如我们只有正样本&#xff0c;模型在最开始训练的时候都是错误的&#xff0c;随着模型的迭代&#xff0c;准确率逐渐从0到1&#xff0c;最终将所有的样本都判别成正样本&#xff0c;也就是都在线的上方。 但真实的场景中有正有负&#xff0c;例如我们要做一个猫狗分类器&…

jsp 实验20

三、源代码以及执行结果截图&#xff1a; NewFile.jsp <% page import "java.io.*" %> <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <jsp:useBean id"english" class "web.Engli…

nginx配置https协议(测试环境)

第一步申请证书 首先申请证书这一步&#xff0c;晚上有很多种方式实现&#xff0c;可以自己用算法实现&#xff0c;也可以找在线生成的网站&#xff0c;我这里使用了在线网站 https://www.toolhelper.cn/SSL/SSLGenerate 第二步将证书放到对应的目录下 这里我们主要用cert.pe…