首页 系统架构 .net webapi 接收图片保存到服务器,并居中剪裁压缩图片

.net webapi 接收图片保存到服务器,并居中剪裁压缩图片

每天解决一些c#小问题,在写微信小程序,或者一些手机软件接口,我们经常要用到上传图片到服务器,或者使用图床去保存我们的图片。

这次就简单明了的来梳理一下如何实现图片的接受和对接受到的图片进行一些处理。

一、实现图片的接收
1.首先要明确现在大部分前端的传输图片的统一规范都是通过POST请求+form表单提交文件的形式

通过 HttpContext.Current.Request.Files 获取请求头里面的文件

然后获取文件流,通过编译文件流另存为文件,保留到指定目录中

其中指定目录必须要现在系统中存在,不然会报错,这里通过前端传输suffix后缀的方式生成文件路径,可以自己写方法判断

上代码,这里是上传一张图片的示例,多张图片可自己更改添加遍历即可,我用的是时间戳命名

[HttpPost,Route("UpLoadImageFiles")]
public string UpLoadImageFiles(string suffix)//suffix是后缀的意思,可以自己判断,也可以前端传输
{

var files = HttpContext.Current.Request.Files;//首先先确定请求里夹带的文件数量
if (files.AllKeys.Any())//如果存在文件
{
using (HttpClient client = new HttpClient())
{
HttpContextBase HttpContext = (HttpContextBase)Request.Properties["MS_HttpContext"];

var text = HttpContext.Request.Files[0].InputStream;//获取到文件流

string path = HttpContext.Request.MapPath("~/");//获取你的根目录
string datetime = GetTimeStamp();
string strPath = path + "File\\" + datetime + suffix;//这里要注意的是先要建立File文件夹,不然会报错,也可以自己写一个检测文件夹,这里就先不赘述
StreamHelp.StreamToFile(text,strPath);//需要用到下一步的帮助类将其保存为文件

//------------------以下是剪裁和压缩图片代码不需要的可以略过
string imgPath = path + "File\\img\\" + datetime + suffix;
ImageHelp img = new ImageHelp(strPath);
img.GetReducedImage(0.8, imgPath);
}
return "添加成功";
}
return "无文件";
}

///获取时间戳的方法
private string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalMilliseconds).ToString();
}
2.获取到文件流后,需要一个帮助类将其转化为文件保存起来,我把它封装了一下StreamHelp.cs

public static class StreamHelp
{
/// <summary>
/// 流转文件
/// </summary>
/// <param name="stream"></param>
/// <param name="fileName"></param>
public static void StreamToFile(Stream stream, string fileName)
{
// 把 Stream 转换成 byte[]
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
// 把 byte[] 写入文件

FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();
}

/// <summary>
/// 文件转流
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static Stream FileToStream(string fileName)

{

// 打开文件
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

// 读取文件的 byte[]
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();

// 把 byte[] 转换成 Stream

Stream stream = new MemoryStream(bytes);
return stream;

}

/// <summary>
/// 流转Bytes
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static byte[] StreamToBytes(Stream stream)

{

byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);

// 设置当前流的位置为流的开始

stream.Seek(0, SeekOrigin.Begin);
return bytes;

}

/// <summary>
/// Bytes转流
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static Stream BytesToStream(byte[] bytes)
{

Stream stream = new MemoryStream(bytes);
return stream;
}
}
二、图片的裁剪
接收图片的步奏这样就已经完成了,图片会保存到你自定义的文件夹中,接下来就是压缩图片
为了方便我将剪裁和压缩图片放在了同一个类中ImageHelp

首先是裁剪,我需要的是居中裁剪,也就是无论什么形状的图片传过来,都会裁剪成正方形

ImageTailor(string path)
剪裁使用的方法就是重画,使用Graphics.DrawImage(),新建一个正方形画布

首先先做长宽对比取最小的的边,然后把长的边剪裁,(bmp.Width - bmp.Height) / 2

这里通过改变原图的起始点进行检查,不用改变原图的长宽,防止图片形变。

GetReducedImage(double Percent, string targetFilePath)
然后通过百分比压缩图片,推荐80%就足够了。

public class ImageHelp
{
public Image ResourceImage;
private int ImageWidth;
private int ImageHeight;
public string ErrMessage;

/// <summary>
/// 类的构造函数
/// </summary>
/// <param name="ImageFileName">图片文件的全路径名称</param>
public ImageHelp(string ImageFileName)
{
var BeImage = Image.FromFile(ImageFileName);
ResourceImage = ImageTailor(ImageFileName);
ErrMessage = "";
}

public bool ThumbnailCallback()
{
return false;
}


/// <summary>
/// 裁剪居中
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public Image ImageTailor(string path)
{
Bitmap bmp = new Bitmap(path);
var width = 0;
var height = 0;
var x = 0;
var y = 0;
if (bmp.Width > bmp.Height)
{
width = bmp.Height;
height = bmp.Height;
y = 0;
x = (bmp.Width - bmp.Height) / 2;
}
else
{
width = bmp.Width;
height = bmp.Width;
y = (bmp.Height - bmp.Width) / 2;
x = 0;
}

Bitmap newbm = new Bitmap(width, height);
Graphics g = Graphics.FromImage(newbm);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
//前Rectangle代表画布大小,后Rectangle代表裁剪后右边留下的区域
g.DrawImage(bmp, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
g.Dispose();
return newbm;
}


/// <summary>
/// 生成缩略图重载方法1,返回缩略图的Image对象
/// </summary>
/// <param name="Width">缩略图的宽度</param>
/// <param name="Height">缩略图的高度</param>
/// <returns>缩略图的Image对象</returns>
public Image GetReducedImage(int Width, int Height)
{
try
{
Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);

return ReducedImage;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}

/// <summary>
/// 生成缩略图重载方法2,将缩略图文件保存到指定的路径
/// </summary>
/// <param name="Width">缩略图的宽度</param>
/// <param name="Height">缩略图的高度</param>
/// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>
/// <returns>成功返回true,否则返回false</returns>
public bool GetReducedImage(int Width, int Height, string targetFilePath)
{
try
{
Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ReducedImage = ResourceImage.GetThumbnailImage(Width, Height, callb, IntPtr.Zero);
ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);

ReducedImage.Dispose();

return true;
}
catch (Exception e)
{
ErrMessage = e.Message;
return false;
}
}

/// <summary>
/// 生成缩略图重载方法3,返回缩略图的Image对象
/// </summary>
/// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>
/// <returns>缩略图的Image对象</returns>
public Image GetReducedImage(double Percent)
{
try
{
Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);

ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);

return ReducedImage;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}


/// <summary>
/// 生成缩略图重载方法4,返回缩略图的Image对象
/// </summary>
/// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param>
/// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:Images ilename.jpg</param>
/// <returns>成功返回true,否则返回false</returns>
public bool GetReducedImage(double Percent, string targetFilePath)
{
try
{
Image ReducedImage;

Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent);
ImageHeight = Convert.ToInt32(ResourceImage.Height * Percent);

ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero);

ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg);

ReducedImage.Dispose();

return true;
}
catch (Exception e)
{
ErrMessage = e.Message;
return false;
}
}
}


本文链接:https://www.cnblogs.com/Jackyye/p/12510943.html

站星网

每天解决一些c#小问题,在写微信小程序,或者一些手机软件接口,我们经常要用到上传图片到服务器,或者使用..

为您推荐

.net入行第5年

没错 我在2024-06-28发布了我的三年.net感想时隔一年,我又来分享了 这一年的时间真的没有经过逛博客园 ,每天都在忙首先,恭喜一下自己 —— 我现在也算是一个小老板了(虽然主业还是程序员 )。毕竟还年轻,想多尝..

卸载阿里云、腾讯云服务器监控系统教程

所周知,阿里云、腾讯云的服务器都自带监控(AliYunDun/阿里云盾/安骑士),大家都不想自己的所作所为都被监控着,比如我在上面安装XX服务,一旦云监控查到,会被警告,很麻烦,我们总想着自己买的东西能够完全自己..

服务器安装数据库MySQL8.0版本,打包导入到MySQL5.6失败的结局方式

最近数据库升级为mysql8.0,在使用过程中发现一些问题,首先mysql8.0有很多新特性,对服务器配置要求较高,所有就考虑把数据库版本切换到MySQL5.6,经过多出测试处理发现在8.0数据库打包的数据导入到5.6总是报错,或..

ASP.Net Core WebApi几种版本控制对比

一、版本控制的好处:(1)有助于及时推出功能, 而不会破坏现有系统。(2)它还可以帮助为选定的客户提供额外的功能。API 版本控制可以采用不同的方式进行控制,方法如下:(1)在URL 中追加版本或作为查询字符串参..

.NET CORE 设置cookie以及获取cookie

使用我这个方式的前提是在mvc中,确认你安装了:Microsoft.AspNetCore.Mvc.然后在继承了Controller的类型中使用我所说的方法。直接使用即可,我是封装了方法供我自己使用,代码如下: public abstract class Control..

.net环境下跨进程、高频率读写数据

一、需求背景1、最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下。单表最大的也在25万左右,历史数据表因为不涉及所以不用考虑,难点在于这个规模的热点数据,变化非常频繁。数据来源..

记录荒废了三年的四年.net开发的第一次面试

对象身在成都小微企业,前两天面试深圳老牌金蝶公司。对我这个荒废了三年光影的人来说,怎一个跨度之大了得?作为人我生第一次面试的,整个面试过程,只能用诡异来形容这次感受。而结尾也是迷迷糊糊中草草收场。不是..

记录荒废了三年的四年.net开发的第二次面试

这次面试的是小公司,深圳计通智能,面试分为初试和复试。使用腾讯视频会议完成。相比与上次面试,这次有所进步,进复试了。当然,这可能也与面试风格有关。这次面试着重与项目经历和技术,因此回答比较顺畅。这一周..

5个高性能 .NET Core 图片处理库推荐

在使用 .NET Core 开发中,图片处理是一个常见需求,如图像缩放、裁剪、格式转换和添加水印等。以下是一些推荐的 .NET Core 图片处理库,它们功能强大且支持多种图像处理功能:1. ImageSharp简介:ImageSharp 是一个..

.NET C# 读取编辑.AVIF图片文件

在 .NET 中读取和编辑 .AVIF 图片文件需要特定的库支持,因为 System.Drawing 等内置功能不直接支持 AVIF 格式。目前可以通过以下方式在 .NET 中实现对 AVIF 文件的读取和编辑:方法一:使用 ImageMagick 的 .NET 封..

.NET C# SkiaSharp读取.AVIF图片文件报错

SkiaSharp 目前对 .AVIF 格式的支持可能依赖于具体的版本和底层库的配置。如果在使用 SkiaSharp 时尝试读取 .AVIF 文件报错,以下是一些可能的原因和解决方案:1. 检查 SkiaSharp 的版本SkiaSharp 的支持功能取决于..

ideogram.ai 人工智能AI图片生成工具网站

Ideogram是一个由前Google Brain员工创立的AI绘画工具,它能够根据文本生成各种风格的图像,尤其擅长准确生成文本内容和抽象图标。Ideogram官网地址:https://ideogram.ai/loginIdeogram是由前Google Brain员工在202..

WebApi中使用OutPutCache Strathweb.CacheOutput.WebApi2使用方法

ASP.NET WebApi里没有MVC里的OutPutCache缓存,使用Strathweb.CacheOutput.WebApi2可以实现OutPutCache功能。首先从Nuget安装最新的Strathweb.CacheOutput.WebApi2版本。Strathweb.CacheOutput.WebApi2使用方法很简..

c# 输出base64图片格式

项目中要输出二维码图片,打算在接口中输出base64字符串。Base64编码在Web方面有很多应用,.Net Framework也提供了现成的功能类(System.Convert)用于将二进制数据转换为Base64字符串。先使用ThoughtWorks.QRCode生成..

c#无损压缩图片代码,可设置压缩质量

之前写过一篇文章《使用htmlagilitypack+xpath抓取网页内容示例》,提到使用htmlagilitypack抓取网页信息。想做一个网络爬虫,但是想把网页上的图片也下载到本地,于是写了下载图片的功能。但是第三方网站上的图片大..

.NET Core c#使用SkiaSharp压缩裁切图片去除水印

在.NET 6中,微软官方建议使用SkiaSharp库进行图片操作。本文主要介绍使用SkiaSharp库压缩裁切图片去除水印。做图片压缩和去除水印,主要是为了在网站中使用图片。比如抓取某网站的文章和图片发布到自己的网站中。但..

.NET Core c#使用SkiaSharp压缩图片

在.NET 6中,微软不建议使用System.Drawing.Common。因为System.Drawing.Common被设计为Window 技术的精简包装器,因此其跨平台实现欠佳。官方建议使用SkiaSharp库进行图片操作。.NET 6 c#使用SkiaSharp压缩图片是比..

.net core webapi RateLimit接口防刷

为了防止 API 接口被频繁地访问从而导致系统崩溃或者数据泄露的情况发生,我们可以采取以下一些措施:限制请求频率可以限制同一 IP 地址在单位时间内可以发送的请求次数,从而避免被某个恶意用户攻击。可以使用 ASP...

c# HttpClient下载图片

c# .NET Core中使用WebClient下载图片会提示已经弃用,推荐使用HttpClient。那么.NET core中如何使用HttpClient下载图片呢?在C#中使用HttpClient下载图片,下面是代码示例:usingSystem;usingSystem.Net.Http;using..

使用C#为图片去除水印

在C#中,你可以使用图像处理库来为图片去除水印。以下是一个基本的示例代码,使用AForge.NET图像处理库来去除图片中的水印:首先,确保你已经安装了AForge.NET库。你可以在Visual Studio的NuGet包管理器中搜索并安装..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制