.NET 6 中,使用System.Drawing操作图片,生成解决方案或打包的时候,会有警告,意思是System.Drawing仅在 'windows' 上受支持。微软官方的解释是:

System.Drawing.Common NuGet 包现在被归为 Windows 特定的库。 在为非 Windows 操作系统编译时,平台分析器会在编译时发出警告。

在非 Windows 操作系统上,除非设置了运行时配置开关,否则将引发 TypeInitializationException 异常,其中 PlatformNotSupportedException 作为内部异常

在 .NET 6 之前,使用 System.Drawing.Common 包不会产生任何编译时警告,也不会引发任何运行时异常。

从 .NET 6 开始,当为非 Windows 操作系统编译引用代码时,平台分析器会发出编译时警告。

当然,使用windows操作系统没有任何问题,Linux的话,需要单独的配置。

可以通过在runtimeconfig.json文件中将System.Drawing.EnableUnixSupport 运行时配置开关设置为来启用对 .NET 6 中的非 Windows 平台的支持:true

或者使用第三方库

ImageSharp

SkiaSharp

Microsoft.Maui.Graphics

正如标题,我使用了ImageSharp来操作图片,并给图片添加水印

//ImageFile为图片物理路径,如下方的注释
public async Task<ImageResult> WaterMark(string ImageFile)
{
ImageResult result = new ImageResult();
//var ImageFile = "D:\www\wwwroot\upload\5176caebc1404caa8b0b350181ae28ab.jpg";
var WaterMark = "D:\\www\\wwwroot\\watermark.png";
string FileName = Guid.NewGuid().ToString("N") + ".jpg";
string SavePath = "D:\\www\\wwwrootupload\\" + FileName;
string imgurl = "/upload/"+FileName;
//为了与System.Drawing.Common有所区别,引用使用全路径
using (var image = await SixLabors.ImageSharp.Image.LoadAsync(ImageFile))
{
using (var clone = image.Clone(ctx => ctx.ApplyScalingImageWaterMark("center")))
{
await clone.SaveAsync(SavePath);
}
result.width = image.Width;
result.height = image.Height; result.url = imgurl;
result.format = ".jpg";
result.state = true;
}
return result;
}

代码比较简单,首先使用SixLabors.ImageSharp.Image.LoadAsync打开图片,然后使用ImageSharp的自定义扩展方法给图片添加水印。

ApplyScalingImageWaterMark扩展方法:

public static class ImageSharpExtention
{
public static IImageProcessingContext ApplyScalingImageWaterMark(this IImageProcessingContext processingContext, string waterPosition = "center",string waterPath)
{
using (var mark_image = SixLabors.ImageSharp.Image.Load(waterPath))
{
int markWidth = mark_image.Width;
int markHeight = mark_image.Height; var imgSize = processingContext.GetCurrentSize(); if (markWidth >= imgSize.Width || markHeight >= imgSize.Height) //对水印图片进行缩放
{
if (imgSize.Width > imgSize.Height)//横的长方形
{
markWidth = imgSize.Width / 2; //宽缩放一半
markHeight = (markWidth * imgSize.Height) / imgSize.Width;
}
else
{
markHeight = imgSize.Height / 2;
markWidth = (markHeight * imgSize.Width) / imgSize.Height;
}
mark_image.Mutate(mk => mk.Resize(markWidth, markHeight));
}
//水印图片完成成立,开始根据位置添加水印
var position = waterPosition;
if (string.IsNullOrEmpty(position))
{
position = "center";
}
position = position.ToLower();
if (string.IsNullOrEmpty(position))
{
position = "center";
}
SixLabors.ImageSharp.Point point = new SixLabors.ImageSharp.Point();
//左上
if (position.Contains("lefttop"))
{
point.X = 10;
point.Y = 10;
}
//上中
if (position.Contains("topcenter"))
{
point.X = (imgSize.Width - mark_image.Width) / 2;
point.Y = 10;
}
//右上
if (position.Contains("righttop"))
{
point.X = (imgSize.Width - mark_image.Width) - 10;
point.Y = 10;
}
//右中
if (position.Contains("rightcenter"))
{
point.X = (imgSize.Width - mark_image.Width) - 10;
point.Y = (imgSize.Height - mark_image.Height) / 2;
}
//右下
if (position.Contains("rightbottom"))
{
point.X = (imgSize.Width - mark_image.Width) - 10;
point.Y = (imgSize.Height - mark_image.Height) - 10;
}
//下中
if (position.Contains("bottomcenter"))
{
point.X = (imgSize.Width - mark_image.Width) / 2;
point.Y = (imgSize.Height - mark_image.Height) - 10;
}
//左下
if (position.Contains("leftbottom"))
{
point.X = 10;
point.Y = (imgSize.Height - mark_image.Height) - 10;
}
//左中
if (position.Contains("leftcenter"))
{
point.X = 10;
point.Y = (imgSize.Height - mark_image.Height) / 2;
}
if (position.Contains("center"))
{
point.X = (imgSize.Width - mark_image.Width) / 2;
point.Y = (imgSize.Height - mark_image.Height) / 2;
}
float opacity=(float)0.8;//设置不透明度,0-1之间 //添加水印
return processingContext.DrawImage(mark_image,point,opacity); }
}
}

ImageResult类:

public class ImageResult
{
/// <summary>
/// 文件名
/// </summary>
public string id { get; set; } /// <summary>
/// 文件大小
/// </summary>
public string size { get; set; } /// <summary>
/// 文件路径
/// </summary>
public string url { get; set; } /// <summary>
/// 文件格式
/// </summary>
public string format { get; set; } /// <summary>
/// 上传状态
/// </summary>
public bool state { get; set; } /// <summary>
/// 上传消息
/// </summary>
public string msg { get; set; } /// <summary>
/// 图片宽
/// </summary>
public int width { get; set; } /// <summary>
/// 图片高
/// </summary>
public int height { get; set; }
}

如有不正确的地方,还望不吝指教。

.NET 6使用ImageSharp给图片添加水印的更多相关文章

  1. Android 图片添加水印图片或者文字

    给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  2. java实现给图片添加水印

    package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...

  3. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  4. ASP.NET -- WebForm -- 给图片添加水印标记

    ASP.NET -- WebForm: 给图片添加水印标记 ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面. 1. Test2.aspx文件 <%@ Page ...

  5. JAVA给图片添加水印

    package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...

  6. 【Python】给图片添加水印的Python及Golang实现

    前言 不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直 ...

  7. .net为图片添加水印(转) jpg png和gif格式

    .net为图片添加水印(转) jpg png和gif格式 .net为图片添加水印(转) jpg png和gif格式,转自csdn的hyde82,现在跟大家一起来分享下: 利 用.net中System. ...

  8. iOS边练边学--(Quartz2D)图片添加水印

    一.给图片添加水印的基本步骤 加载图片 手动创建位图上下文 绘制原生的图片 给原生的图片添加文字 生成一张图片给我们,从上下文中获取图片 关闭上下文 二.注意:位图上下文的获取方式跟layer上下文不 ...

  9. int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件

    int.TryParse非预期执行引发的思考   问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Reque ...

  10. 海报工厂之(一)android 如何给图片添加水印和文字

    在Android中如何给图片添加水印,下面截取了部分核心代码,仅供参考: /**      * 获取图片缩小的图片      * @param src      * @return      */   ...

随机推荐

  1. Windows DNS服务器的子网掩码排序

    对于跨多个站点部署的应用服务,会在各个站点都有服务器,并且对应不同的IP地址.我们希望每个客户端访问就近的资源.这个时候可以启用Windows DNS服务器中的子网掩码排序(子网优先)netmask ...

  2. MinIO对接k8s使用

    文档地址:https://github.com/minio/operator/blob/master/README.md https://docs.min.io/minio/k8s/deploymen ...

  3. Portainer 基本功能介紹之升級映像檔並更新 Container

    文档地址:https://www.asustor.com/zh-tw/online/College_topic?topic=145#dpt7

  4. 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

    摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...

  5. git-secret:在 Git 存储库中加密和存储密钥(上)

    当涉及处理机密信息(如密码.令牌.密钥文件等)等,以下问题值得考虑: 安全性十分重要,但高安全性往往伴随着高度的不便. 在团队中,共享某些密钥有时无法避免(因此现在我们需要考虑在多人之间分发和更新密钥 ...

  6. NSIS隐藏窗口标题栏自带的按钮(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比较好奇楼主为啥要隐藏关闭按钮,就顺口问了下,结果楼主已经弃楼,未给出原因,猜着可能是为了做自定义页面美化,无法改变按纽外观之类的,后来琢磨了下, ...

  7. 关于成本标签管理-基于-Resource Groups & Tag Editor-统计指定Project-所有资源

    背景:因我们所有AWS都是使用Project标签作为成本标签的,今天因一个项目决定彻底退役下线 于是决定要完全清理此项目的所有资源,防止继续产生费用~ 首先想到的去通过Project 在ec2 , s ...

  8. PHP全栈开发(九):javascript 基础

    js不允许读取电脑上的文件: js不允许修改服务器上的文件,修改服务器上的文件是php来做的事情. 因此js是一个前端脚本. 前端的三个语言是HTML/CSS/JavaScript 这三个东东Java ...

  9. python中的多线程与多进程

    线程概念: 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位. 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其 ...

  10. 一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 11.HashMap和HashTable的区别及底层实现 12.ConcurrentHashMap原理简述,jdk7和jd ...