在 ASP.NET Core 7 Web API 中压缩上传的图像
这是一个 ASP.NET Core 7 Web API 项目,我们可以用它来压缩图像。
引言
在这个项目中,我们可以找到 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
历史
- 2023 年 1 月 25 日:初始版本