c# - 调用 System.Drawing.Image.Save 时出现无效参数错误

标签 c# reduce image-size

我在调用 System.Drawing.Image.Save 函数时收到无效参数错误。 我用谷歌搜索并找到了一些建议,但没有任何效果。 我想做的是,当我上传图像时,如果它大于 100kb,我想将图像大小减半。请帮忙。

     System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(realpath);


                        FullsizeImage = System.Drawing.Image.FromFile(realpath);                    
                        int fileSize = (int)new System.IO.FileInfo(realpath).Length;
                        while (fileSize > 100000) //If Larger than 100KB
                        {
                            SaveJpeg(realpath, FullsizeImage);
                            fileSize = (int)new System.IO.FileInfo(realpath).Length;
                        }



 private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats 
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec 
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    }

    public static void SaveJpeg(string path, Image img)
        {


            Image NewImage = img;
            img.Dispose();

            EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, 85L);
            EncoderParameters encoderParams = new EncoderParameters(1);
            encoderParams.Param[0] = qualityParam;

            ImageCodecInfo jpegCodec = GetEncoderInfo(GetMimeType(path.Substring(path.LastIndexOf('.'), path.Length - path.LastIndexOf('.'))));
//THE ERROR IS HERE!!!!!!
            NewImage.Save(path, jpegCodec, encoderParams); 
//THE ERROR IS HERE!!!!!!

        }




    public static string GetMimeType(string extension)
        {
            if (extension == null)
            {
                throw new ArgumentNullException("extension");
            }

            if (!extension.StartsWith("."))
            {
                extension = "." + extension;
            }

            switch (extension.ToLower())
            {
                #region Big freaking list of mime types
                // combination of values from Windows 7 Registry and 
                // from C:\Windows\System32\inetsrv\config\applicationHost.config
                // some added, including .7z and .dat

                case ".323": return "text/h323";

 // more extension here..

                #endregion

                default:
                    // if you have logging, log: "No mime type is registered for extension: " + extension);
                    return "application/octet-stream";
            }
        }

编辑:我修改了如下代码,现在图像正在保存,没有任何异常!谢谢!但这里还有另一个问题。文件大小没有减少。这意味着我的 while 循环永远不会退出。请帮助并再次感谢。

using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(realpath)))
                    {
                        using (Image FullsizeImage = Image.FromStream(ms))
                        {
                            //code here                           
                            int fileSize = (int)new System.IO.FileInfo(realpath).Length;
                            while (fileSize > 100000) //If Larger than 100KB
                            {
                                SaveJpeg(realpath, FullsizeImage, 85L);
                                fileSize = (int)new System.IO.FileInfo(realpath).Length;
                            }

                        }
                    }

谁能帮帮我,我的问题还没有解决:(

最佳答案

因为您要处理一个 image 对象。

public static void SaveJpeg(string path, Image img)
 {
  Image NewImage = img;
  img.Dispose(); <------- Here
  ...
 }

编辑:方法 Image.FromFile 文件打开一个流,并且在您的方法未终止之前该文件不会关闭。尝试使用 MemoryStream。

using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(realPath)))
  {
   using (Image img = Image.FromStream(ms))
    {
     ImageCodecInfo myImageCodecInfo;
     Encoder myEncoder;
     EncoderParameter myEncoderParameter;
     EncoderParameters myEncoderParameters;


     myImageCodecInfo = GetEncoderInfo("image/jpeg");
     myEncoder = Encoder.Quality;

     myEncoderParameters = new EncoderParameters(1);

     myEncoderParameter = new EncoderParameter(myEncoder, 85L);
     myEncoderParameters.Param[0] = myEncoderParameter;
     img.Save(realPath, myImageCodecInfo, myEncoderParameters);
     }
  }

关于c# - 调用 System.Drawing.Image.Save 时出现无效参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12245800/

相关文章:

javascript - 在加载图像之前获取图像大小

c# - 为什么内部项目使用 ASP.Net Web Api 而不是 SignalR

javascript - Javascript从具有相同属性的不同对象创建公共(public)对象,并具有相同的键并添加金额

C# 如果使用 LINQ 值为 NULL,则不要使用 GroupBy 进行聚合

python - 使用reduce函数减少python中的大数据集

Python 映射 lambda 过滤器帮助使用 IF

html - 如果 div 的宽度小于图像的实际宽度,则以 100% 宽度显示图像

安卓。从其资源 id 获取图像大小

C# 和动态单选按钮列表 |提交时的单选按钮值不正确

c# - 在我的下载器中添加暂停和继续功能