c# .net linux ImageSharp+FastDFS+Base64上传图片,压缩图片大小,图像处理dcoker中使用也可以

.net 以前是用System.Drawing来处理图片,但是在dcoker 、linux上用不了

微软官方推荐用

1、SkiaSharp

如果项目运行到docker里,需要NUGET安装SkiaSharp.NativeAssets.Linux.NoDependencies

注意:如果你同时引用SkiaSharp.NativeAssets.Linux和SkiaSharp.NativeAssets.Linux.NoDependencies 可能会导致docker中运行报错,记得只能引用一个SkiaSharp.NativeAssets.Linux.NoDependencies

2、ImageSharp

我感觉这个用起来简单一些

nuget安装SixLabors.ImageSharp

使用:

这里用ImageSharp 为例子

我这里是通过jquery蒋图片转为base64 ,用法见jquery把图片路径转成base64_mob649e815e258d的技术博客_51CTO博客

新建controller,接收前端提交过来的base64,并返回上传后的文件名

cs 复制代码
  public string addFileToServer(string base64stringdata, string oldfilename)
        {
            
            byte[] imgBytes;
            if (base64stringdata.Contains(","))
            {
                 //前端用jQuery将图片路径转换为base64的话,这里需要 
                // 或者在jquery取值时先将Data URL转换为base64字符串var base64String = dataURL.split(",")[1];
                imgBytes = Convert.FromBase64String(base64stringdata.Remove(0, base64stringdata.IndexOf(',') + 1));
            }
            else
            {
                imgBytes = Convert.FromBase64String(base64stringdata);
            }
            //取后缀名
            string strext =  System.IO.Path.GetExtension(oldfilename);

            if (strext == ".jpg" || strext == ".gif" || strext == ".jpeg" || strext == ".bmp" || strext == ".png")
            { //图片自动压缩 并上传       

                 imgBytes = ImageSharpTools.ImageReSise(imgBytes, strext, 800, 800);
            }
            //上传文件
             string    returnFileName = new FastDFSNetCoreHelper().Upload(imgBytes, strext);
             return returnFileName ;
        }

nuget安装SixLabors.ImageSharp

新建类 ImageSharpTools.cs

cs 复制代码
 public class ImageSharpTools
    {
        /// <summary>
        /// 调整图片尺寸
        /// </summary>
        /// <param name="imageBytes">字节流</param>
        /// <param name="ext">后缀名</param>
        /// <param name="towidth">设置宽度</param>
        /// <param name="toheight">设置高度</param>
        /// <returns></returns>
        public static byte[] ImageReSise(byte[] imageBytes,string ext,int towidth,int toheight)
        {
            var image = Image.Load(imageBytes);

            int imageWidh = image.Width;
            int imageHight = image.Height;

            if (imageWidh > imageHight)
            {//如果宽大于高,调整比例
                if (imageWidh > towidth)
                {
                    toheight = (int)(imageHight * ((double)towidth / (double)imageWidh));
                    imageWidh = towidth;
                }
                else
                {
                    towidth = imageWidh;
                }
            }
            if (imageWidh < imageHight)
            { //如果宽小于高,调整比例
                if (imageHight > toheight)
                {
                    towidth = (int)(imageWidh * ((double)toheight / (double)imageHight));
                    imageHight = toheight;
                }
                else
                {
                    toheight = imageHight;
                }
            }

            //调整图片尺寸
            image.Mutate(x => x.Resize(towidth, toheight, KnownResamplers.Spline));
            MemoryStream ms = new MemoryStream();
            image.SaveAsPngAsync(ms);
            var byteFile = ms.ToArray();
            ms.Close();
            ms.Dispose();
            image.Dispose();
            return byteFile;
        }
}

nuget安装FastDFSNetCore

新建类:FastDFSNetCoreHelper.cs

cs 复制代码
using FastDFS.Client;
using System.Net;

public class FastDFSNetCoreHelper
    {
        public string Upload(byte[] imgBytes, string ext)
        {
            if (ext.Contains("."))
            {
                ext = ext.Replace(".", "");
            }           
            List<IPEndPoint> pEndPoints = new List<IPEndPoint>()
            {
                //设置dfs的服务器地址和端口
                new IPEndPoint(IPAddress.Parse("10.112.250.130"), 2315)
            };
            ConnectionManager.Initialize(pEndPoints);
            StorageNode storageNode = FastDFSClient.GetStorageNodeAsync().Result;
            var str = FastDFSClient.UploadFileAsync(storageNode, imgBytes, ext);
            return "/" + storageNode.GroupName + "/" + str.Result.ToString();
        }
    }

完美OK

相关推荐
Xの哲學2 分钟前
Linux NAT 深度剖析: 从设计哲学到实现细节
linux·服务器·网络·架构·边缘计算
Hui Baby37 分钟前
LSM 原理、实现及与 B+ 树的核心区别
java·linux·算法
眠りたいです40 分钟前
Docker:容器虚拟化技术基础-namespace,cgroups,资源管理与LXC
运维·docker·中间件·容器
小周学学学41 分钟前
vSphere DRS与vSphere HA
运维·服务器·vmware·虚拟化
德迅云安全—珍珍1 小时前
主机安全-德迅卫士
linux·服务器·安全
云动课堂1 小时前
一键升级 OpenSSH 10到最新版:告别手工编译、兼容国产系统、批量部署无忧!
linux·服务器·centos
一分半心动1 小时前
lnmp架构 mysql数据库Cannot assign requested address报错解决
linux·mysql·php
ChristXlx1 小时前
Linux安装mysql(虚拟机适用)
linux·mysql
知星小度S1 小时前
系统核心解析:深入操作系统内部机制——基础I/O探秘:文件描述符、重定向与Shell的I/O魔法(二)
linux·i/o
小周学学学1 小时前
vcenter的SMB备份
运维·服务器·vmware·虚拟化