目录
介绍
在这个项目中,我们可以找到ASP.NET Core Web API来压缩上传的图像并将压缩的图像保存到./wwwroot/images文件夹中。
创建.NET 7项目的准则
打开Visual Studio 2022,然后创建一个新项目。在模板中搜索 ASP.NET Core Web API,然后选择“下一步”。
然后给出下面的项目名称:
现在,如下面给出的屏幕截图所示。选择.NET Framework,即.NET 7,并保持其余内容不变,然后单击下一步按钮。
现在,创建名为 ImageCompressController.cs 的控制器并创建名称为UploadImage()的HttpPost方法。
[HttpPost]
[RequestFormLimits(MultipartBodyLengthLimit = 104857600)]
[RequestSizeLimit(104857600)]
public IActionResult UploadImage([FromForm] FileUploadModel model)
{
try
{
// this is the directory where file is upload
var uploadFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images");
if (!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
// this is the place where file is uploaded
string fileUrl = Path.Combine(uploadFolder,
$"{Guid.NewGuid()}_{model.file.FileName}");
Stream strm = model.file.OpenReadStream();
CompressImage.Compressimage(strm, fileUrl);
return Ok(new { message = "Compressed successfully" });
}
catch (Exception ex)
{
_logger.LogError
(ex, "An error occured while trying to compress the uploaded image.");
return BadRequest(new { message = ex.Message });
}
}
创建一个FileUploadModel类,该类是post API的请求模型。此类包含IFormFile属性。
public class FileUploadModel
{
public IFormFile file { get; set; }
}
在util 文件夹中创建类 CompressImage.cs,该文件夹是创建压缩图像函数的帮助程序类。
public class CompressImage
{
public static void Compressimage(Stream srcImgStream, string targetPath)
{
try
{
// Convert stream to image
using var image = Image.FromStream(srcImgStream);
float maxHeight = 900.0f;
float maxWidth = 900.0f;
int newWidth;
int newHeight;
var originalBMP = new Bitmap(srcImgStream);
int originalWidth = originalBMP.Width;
int originalHeight = originalBMP.Height;
if (originalWidth > maxWidth || originalHeight > maxHeight)
{
// To preserve the aspect ratio
float ratioX = (float)maxWidth / (float)originalWidth;
float ratioY = (float)maxHeight / (float)originalHeight;
float ratio = Math.Min(ratioX, ratioY);
newWidth = (int)(originalWidth * ratio);
newHeight = (int)(originalHeight * ratio);
}
else
{
newWidth = (int)originalWidth;
newHeight = (int)originalHeight;
}
var bitmap = new Bitmap(originalBMP, newWidth, newHeight);
var imgGraph = Graphics.FromImage(bitmap);
imgGraph.SmoothingMode = SmoothingMode.Default;
imgGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
imgGraph.DrawImage(originalBMP, 0, 0, newWidth, newHeight);
var extension = Path.GetExtension(targetPath).ToLower();
// for file extension having png and gif
if (extension == ".png" || extension == ".gif")
{
// Save image to targetPath
bitmap.Save(targetPath, image.RawFormat);
}
// for file extension having .jpg or .jpeg
else if (extension == ".jpg" || extension == ".jpeg")
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
Encoder myEncoder = Encoder.Quality;
var encoderParameters = new EncoderParameters(1);
var parameter = new EncoderParameter(myEncoder, 50L);
encoderParameters.Param[0] = parameter;
// Save image to targetPath
bitmap.Save(targetPath, jpgEncoder, encoderParameters);
}
bitmap.Dispose();
imgGraph.Dispose();
originalBMP.Dispose();
}
catch (Exception ex)
{
throw ex;
}
}
public static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
}
在上面的函数中,下面的部分用于以纵横比裁剪图像。如果原始图像的高度和宽度大于纵横比,则将其裁剪为所需的比例,否则原始图像比例不会发生变化。
if (originalWidth > maxWidth || originalHeight > maxHeight)
{
// To preserve the aspect ratio
float ratioX = (float)maxWidth / (float)originalWidth;
float ratioY = (float)maxHeight / (float)originalHeight;
float ratio = Math.Min(ratioX, ratioY);
newWidth = (int)(originalWidth * ratio);
newHeight = (int)(originalHeight * ratio);
}
else
{
newWidth = (int)originalWidth;
newHeight = (int)originalHeight;
}
var bitmap = new Bitmap(originalBMP, newWidth, newHeight);
var imgGraph = Graphics.FromImage(bitmap);
.jpg或.jpeg图像的编码质量为50%。50L表示压缩图像的质量。
// for file extension having png and gif
if (extension == ".png" || extension == ".gif")
{
// Save image to targetPath
bitmap.Save(targetPath, image.RawFormat);
}
// for file extension having .jpg or .jpeg
else if (extension == ".jpg" || extension == ".jpeg")
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
Encoder myEncoder = Encoder.Quality;
var encoderParameters = new EncoderParameters(1);
var parameter = new EncoderParameter(myEncoder, 50L);
encoderParameters.Param[0] = parameter;
// Save image to targetPath
bitmap.Save(targetPath, jpgEncoder, encoderParameters);
}
bitmap.Save()用于将压缩图像保存在目标路径中。
这就是使用ASP.NET Core 7 Web API压缩图像并将其保存到所需文件路径方式。
运行命令
dotnet watch run
Swagger
https://www.codeproject.com/Tips/5352886/Compress-Uploaded-Image-in-ASP-NET-Core-7-Web-API