【问题标题】:How to optimize multiple images from folder at once (decrease file size) manually in webapi?如何在 webapi 中手动优化文件夹中的多个图像(减小文件大小)?
【发布时间】:2026-02-10 12:20:04
【问题描述】:

大家好,我正在开发 webapi 我需要优化文件夹中的图像我有 Uploaded images into one folder 在上传到 destination folder 之前我需要减少总图像的 image size in KB 这里我正在优化 @987654324 @ 并保存在一个文件夹中 现在我需要优化这些图像你能帮我吗 我怎么能那样做。实际上我是 webapi 的新手。 任何人都可能有任何想法,请帮助我,但我需要做一件事this manually 提前谢谢你

这是我的控制器

public Task<HttpResponseMessage> Post()
        {
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            var uploadFolder = HostingEnvironment.MapPath("~/App_Sprites/UploadFolder");
            uploadFolder = Path.Combine(uploadFolder, DateTime.Now.ToString("yyyyMMddhhmmssfff"));
            Directory.CreateDirectory(uploadFolder);
            var streamProvider = new PreserveFilenameMultipartFileStreamProvider(uploadFolder);

            return Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
            {
                foreach (var uploadedFile in Directory.GetFiles(uploadFolder))
                {
                    var thumbnail = Path.Combine(uploadFolder, "thumb-" + Path.GetFileName(uploadedFile));
                    var medium = Path.Combine(uploadFolder, "medium-" + Path.GetFileName(uploadedFile));
                    var large = Path.Combine(uploadFolder, "large-" + Path.GetFileName(uploadedFile));
                    ImageTools.Resize(uploadedFile, thumbnail, 80, 80);
                    ImageTools.Resize(uploadedFile, medium, 48, 48);
                    ImageTools.Resize(uploadedFile, large, 128, 128);
                }
                return Request.CreateResponse(HttpStatusCode.Accepted);
            });
        }
    }

这是我的类文件

 public class ImageTools
    {
        public static void Resize(string original, string output, int width, int height)
        {
            using (var image = Image.FromFile(original))
            using (var thumbnail = new Bitmap(width, height))
            using (var graphics = Graphics.FromImage(thumbnail))
            {
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = SmoothingMode.HighQuality;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphics.CompositingQuality = CompositingQuality.HighQuality;

                graphics.DrawImage(image, 0, 0, width, height);

                ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
                EncoderParameters encoderParameters;
                encoderParameters = new EncoderParameters(1);
                encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                thumbnail.Save(output, info[1], encoderParameters);
            }
        }
    }

类文件

 public class PreserveFilenameMultipartFileStreamProvider : MultipartFileStreamProvider
        {
            public PreserveFilenameMultipartFileStreamProvider(string rootPath)
                : base(rootPath)
            {
            }

            public override string GetLocalFileName(HttpContentHeaders headers)
            {
                return headers.ContentDisposition.FileName.Replace("\"", "");
            }
        }

这是我的布局页面

@using (Html.BeginRouteForm("DefaultApi", new { httproute = "", controller = "Upload" }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="image" multiple="multiple" accept="image/*" />
    <button type="submit">Upload</button>
}

我创建了一个文件夹,现在图像保存在文件夹中,但文件大小以 kb 为单位增加,但我们需要减少请帮助我

【问题讨论】:

  • 您能否稍微编辑一下您的帖子 - 目前尚不清楚似乎是什么问题 - 调整图像大小会导致字节大小增加?如果是这样 - 请提供一些示例,例如您使用哪些库来调整大小以及如何使用它们。我不相信这与 webAPI 有任何关系。
  • 我已经更新了请看我的代码请帮助我完成这项工作

标签: .net image-processing .net-4.0 asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您应该为 QualityLevel 的 Resize 方法添加一个参数,并使用此参数更改不同的渲染。

您正在调整您的图像大小并将质量设置为完整,这不是很有效。

您应该尝试指定另一种文件格式,我不知道您使用的是哪种文件格式,但 .PNG 用于小图像,.JPG 用于较大图像帮助。 (.GIF 如果你真的需要额外的字节)

在使用图像之前应该进行一些图像处理,但我想你在这里真的没有选择。

【讨论】:

    【解决方案2】:

    如上所述,您的问题需要做一些小改动,试试这个,只需在您的控制器中调用此文件,希望对您有所帮助

     public class ImageDecrease
            {
                public static void Resize(Stream original, string output, int width, int height)
                {
                    using (var image = Image.FromStream(original))
                    using (var thumbnail = new Bitmap(width, height))
                    using (var graphics = Graphics.FromImage(thumbnail))
                    {
                        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        graphics.SmoothingMode = SmoothingMode.HighQuality;
                        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                        graphics.CompositingQuality = CompositingQuality.HighQuality;
    
                        graphics.DrawImage(image, 0, 0, width, height);
    
                        ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
                        EncoderParameters encoderParameters;
                        encoderParameters = new EncoderParameters(1);
                        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                        thumbnail.Save(output, info[1], encoderParameters);
                    }
                }
            }
    

    【讨论】: