在c#中以更少的损失调整图像大小

  • 本文关键字:调整 损失 图像 c#
  • 更新时间 :
  • 英文 :


在我的项目中,我必须使用c#程序通过输入百分比来减小图像大小。

但是,有问题:

图片格式: TIF

原图片: 6MB,分辨率:1920*1080

调整图片大小: 27KB与1728*972

缩小到 90%

不应该是27KB,而是>5 mb…

代码
    public Image reduce(Image sourceImage, string size)
    {
        var original = sourceImage;
        //store image widths in variable for easier use
        var oW = (decimal)original.Width;
        var oH = (decimal)original.Height;
        var dW = (decimal)desiredWidth;
        var dH = (decimal)desiredHeight;
        var dR = (decimal)Int32.Parse(size);;
        var nH = oH * (dR / 100); 
        var nW = oW * (dR / 100);
        var resized = new Bitmap((int)nW, (int)nH);
        using (Graphics gr = Graphics.FromImage(sourceImage))
        {
            gr.SmoothingMode = SmoothingMode.HighQuality;
            gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gr.DrawImage(resized, new Rectangle(0, 0, (int)nH, (int)nW));
        }
        return resized;
    }

任何想法?

              Image nImage = imagetool.reduce(originalImg, size);
                  
              byte[] nImageData = imagetool.imageToByteArray(nImage);
                  
              int nImageSize = nImageData.Length;
              Console.WriteLine("new image size " + nImageSize );

               try
               {
                  Console.WriteLine("trying to update the image in sharepoint");
                        
                  web.Files.Add(Path.Combine(itemsite, itemSubsite, fileURL), nImageData, true);
               }

更新2

    public byte[] imageToByteArray(Image imageIn)
    {
        using (var ms = new MemoryStream())
        {
            if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                return ms.ToArray();
            }
            if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
            if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Bmp))
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                return ms.ToArray();
            }
            if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Gif))
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                return ms.ToArray();
            }
            if (imageIn.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Tiff))
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);
                return ms.ToArray();
            }
            else
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                return ms.ToArray();
            }
        }
    }

nImage在其他位置

创建
var resized = new Bitmap((int)nW, (int)nH)

,其格式不是TIFF,代码结束于:

 else
        {
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return ms.ToArray();
        }

您的新图像没有任何格式,当您创建新的Bitmap对象时,它不会自动从您的原始图像中读取,因此被写入为jpg,(从您的代码的最终else部分)

解决这个问题的方法是将原始格式传递到imageToByteArray,并在将新图像写入MemoryStream时使用它。您还可以取消长if..else

public byte[] imageToByteArray(Image imageIn, ImageFormat format)
{
    using(var ms = new MemoryStream())
    {
        imageIn.Save(ms,format);
        return ms.ToArray();
    }
 }

你的呼叫代码应该是

byte[] nImageData = imagetool.imageToByteArray(nImage, originalImg.RawFormat);

最新更新