【问题标题】:Multiple image compression without quality loss before upload上传前多张图片压缩无质量损失
【发布时间】:2015-09-02 08:10:06
【问题描述】:

我需要将多张图片上传到服务器,但在上传之前,它们必须在客户端进行压缩而不会造成质量损失(使用 jQuery)。

有什么方法可以获取每张图片的宽高吗?

 <script type="text/javascript">
    $(document).ready(function() {
        $("#Upload").click(function() {
            var formData = new FormData();
            var image = new Image();
            var totalFiles = document.getElementById("fileUpload").files.length;

            for (var i = 0; i < totalFiles; i++) {
                var file = document.getElementById("fileUpload").files[i];
                formData.append("fileUpload", file);
            }

            $.ajax({
                type: "POST",
                url: '/Ajaximage/Upload',
                data: formData,

                dataType: 'json',
                contentType: false,
                processData: false,
                success: function(response) {
                    //alert('succes!!');
                },
                error: function(error) {
                    //alert("Failed");
                }
            });
        });
    });
</script>

【问题讨论】:

  • 上传图片的ajax请求不是驻留在服务器上吗?用户要么在自己的计算机上进行无损压缩,要么让上传脚本来做。
  • 请不要在标题中添加库或语言名称。它们不是必需的,因为它们是标签列表的一部分。此外,在发布之前更好地格式化代码(如适当的缩进,删除不必要的换行符等)。更好的格式化代码有助于提高可读性。我对内容进行了一些改写,以更好地解释您的问题。谈到代码,您是否尝试过任何特定于压缩图像的方法?它有没有给你任何错误?如果是,请附上相关的错误信息。

标签: jquery ajax razor model-view-controller


【解决方案1】:

在您使用 ajax 调用的 Web 服务上收到文件后。将其类型转换为 System.Drawing.Image 对象。如果 System.Drawing.Image 对象,您可以使用 Height 和 Width 属性获取图像的高度和宽度。

通过压缩我认为你的意思是调整图像大小 试试这个功能

  public  System.Drawing.Image resizeImage(System.Drawing.Image imgToResize,int Width,int Height)
  {



         int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)Width / (float)sourceWidth);
        nPercentH = ((float)Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((System.Drawing.Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (System.Drawing.Image)b;
    }

会有轻微的质量损失,但会保持纵横比

【讨论】: