簡體   English   中英

在 C# 中以較少的損失調整圖像大小

[英]resize Image with less loss in C#

在我的項目中,我必須通過輸入百分比來使用 C# 程序減小圖像大小。

然而,有些不對勁:

圖片格式: TIF

原圖: 6MB,1920*1080

調整大小的圖像: 27KB,1728*972

縮小到90%

它不應該是 27KB,而是 > 5MB...

代碼

    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長的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM