C# 将图像缩小到一定数量的像素

C# Downscale image to a certain number of pixels

我有一些图像,比方说 6.000.000 像素,我想将它们缩放到该值附近的某个位置。

public void downscaleByCalculateInSampleSize(string filePath, string newPath)
    {
        int reqNumberOfPixels = 6000000;

        double inSampleSize = 1;

        using (System.Drawing.Image oImage = System.Drawing.Image.FromFile(filePath))
        {
            int newWidth = oImage.Width;
            int newHeight = oImage.Height;

            int actualNumberofPixels = oImage.Width * oImage.Height;

            if (actualNumberofPixels > reqNumberOfPixels)
            {
                inSampleSize = Math.Sqrt(actualNumberofPixels / reqNumberOfPixels);

                newWidth = Convert.ToInt32(Math.Round((float)oImage.Width / inSampleSize));
                newHeight = Convert.ToInt32(Math.Round((float)oImage.Height / inSampleSize));
            }

            var newImage = new Bitmap(newWidth, newHeight);

            Graphics graphics = Graphics.FromImage(newImage);

            graphics.DrawImage(oImage, 0, 0, newWidth, newHeight);

            newImage.Save(newPath);
        }
    }

我尝试缩小尺寸为 6367 x 4751 像素和 72 dpi 分辨率(24 位深度)且大小为 8.03 MB 的图像。我已经调整了这张图片的大小,我希望它的尺寸​​要小得多(低于 8 MB),但我的有 17 张。缩放后的图片为 2847 x 2125(96 dpi,32 位深度)。为什么会这样? 有没有办法将图像缩小到请求的像素数量,结果尺寸更小?我不关心分辨率...

您在以下位置使用整数除法和截断结果:

inSampleSize = Math.Sqrt(actualNumberofPixels / reqNumberOfPixels);

试试看:

inSampleSize = Math.Sqrt((double)actualNumberofPixels / (double)reqNumberOfPixels);

此外,保存方式:

newImage.Save(newPath, ImageFormat.Jpeg);

如果您使用具有那么多像素的有损格式保存,您得到的尺寸似乎太大了