簡體   English   中英

如何通過選擇/更改圖像kb來調整圖像大小? 而不是分辨率

[英]How can i resize images by selecting/changing the images kb ? And not resolution

這就是我的使用方式:

Bitmap bmp1 = new Bitmap(ResizeImages(fileName,100,100));

但現在我要在此示例中更改圖像分辨率100,100但現在我想按kb更改圖像大小,我的意思是文件大小是3.64MB還是例如3,227KB,我知道在網站上我想上傳可以上傳的最大圖像大小為1024k,因此我希望能夠將圖像大小更改為1024k。

我想做一些像ResizeImages的事情,但是要增加像100,100這樣的分辨率來增加像ResizeImages(fileName,1024);這樣的大小。

這是ResizeImages方法,但是最好制作一個新方法?

private static Bitmap ResizeImages(String filename, int maxWidth, int maxHeight)
        {
            using (Image originalImage = Image.FromFile(filename))
            {
                //Caluate new Size
                int newWidth = originalImage.Width;
                int newHeight = originalImage.Height;
                double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
                if (aspectRatio <= 1 && originalImage.Width > maxWidth)
                {
                    newWidth = maxWidth;
                    newHeight = (int)Math.Round(newWidth / aspectRatio);
                }
                else if (aspectRatio > 1 && originalImage.Height > maxHeight)
                {
                    newHeight = maxHeight;
                    newWidth = (int)Math.Round(newHeight * aspectRatio);
                }
                if (newWidth >= 0 && newHeight >= 0)
                {
                    Bitmap newImage = new Bitmap(newWidth, newHeight);
                    using (Graphics g = Graphics.FromImage(newImage))
                    {
                        //--Quality Settings Adjust to fit your application
                        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
                        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                        g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
                        return newImage;
                    }
                }
                return null;
            }

更新

我找到了這兩種方法,並且可以正常工作,但是我不了解它如何隨着尺寸變化而工作:

private static ImageCodecInfo GetEncoderInfo(String mimeType)
        {
            int j;
            ImageCodecInfo[] encoders;
            encoders = ImageCodecInfo.GetImageEncoders();
            for (j = 0; j < encoders.Length; ++j)
            {
                if (encoders[j].MimeType == mimeType)
                    return encoders[j];
            }
            return null;
        }
        private static void SaveJPGWithCompressionSetting(Image image, string szFileName, long lCompression)
        {
            EncoderParameters eps = new EncoderParameters(1);
            eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, lCompression);
            ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
            image.Save(szFileName, ici, eps);
        }

在構造函數中,我做到了:

Bitmap bmp1 = new Bitmap(fileName);
SaveJPGWithCompressionSetting(bmp1, FilePath, 10L);
bmp1.Dispose();

10L是什么意思?

例如,在這種情況下,fileName的原始大小為6.71MB現在,新的重新解析的文件為566KB

並且如果我想使文件大小為例如1024k?

因此,現在您使用以下代碼創建jpeg文件:

Bitmap bmp1 = new Bitmap(fileName);
SaveJPGWithCompressionSetting(bmp1, FilePath, 10L);
bmp1.Dispose();

10L將用於Encoder.Quality ,這是一個從0到100的數字,其中100是最高質量。 10LL表示它很long ,而不是int 因此,上面的示例將編寫一個質量為10(即10%)的jpeg。

由於10%的質量非常低,您可能會發現它看起來不太好。 75%是更常見的值。 但是使用10%時,文件大小從6.71MB減少到566KB,這很多。 當您使用75%時,文件將更大。

當您需要1024k時,您需要找到正確的質量,該質量會導致文件大小或更小,因為您不能超過限制。 沒有簡單的方法來確定您需要的質量。 您只需要嘗試一下。

例如,您以50%開始,如果文件仍然太大,則嘗試25%。 您將繼續這種方式,直到找到最佳價值。 如果您可以嘗試使用此內存,那將是最好的。 但是我不確定那是可能的。 否則,您只需要將映像寫入磁盤,然后檢查文件大小即可。

它還取決於圖像,文件大小將以某種質量減少多少。 例如,屏幕截圖比自然照片更難壓縮(使用jpeg)。 因此,如果文件大小為1024k,則對於每張圖片,質量設置可能會有所不同。

暫無
暫無

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

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