Измените размер изображения JPEG до фиксированной ширины, сохраняя соотношение сторон как есть.

Как бы вы изменили размер изображения JPEG до фиксированной ширины, сохранив соотношение сторон? Простым способом, сохраняя при этом качество.


person cllpse    schedule 21.11.2011    source источник


Ответы (5)


Это будет масштабироваться только по вертикальной оси:

    public static Image ResizeImageFixedWidth(Image imgToResize, int width)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = ((float)width / (float)sourceWidth);

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (Image)b;
    }
person rboarman    schedule 17.07.2012

Если вы уменьшаете ширину на 25 процентов до фиксированного значения, вы должны уменьшить высоту на 25 процентов.

Если вы увеличиваете ширину на 25 процентов до фиксированного значения, вы должны увеличить высоту на 25 процентов.

Это действительно прямолинейно.

person Steve Wellens    schedule 21.11.2011

Предполагая, что есть переменная (double width):

Image imgOriginal = Bitmap.FromFile(path);
double height = (imgOriginal.Height * width) / imgOriginal.Width;
Image imgnew = new Bitmap((int)width, (int)height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(imgnew);
g.DrawImage(imgOriginal, new Point[]{new Point(0,0), new Point(width, 0), new Point(0, height)}, new Rectangle(0,0,imgOriginal.Width, imgOriginal.Height), GraphicsUnit.Pixel);

В конце концов у вас будет новое изображение с шириной x высотой, затем вам нужно будет сбросить графику и сохранить imgnew.

person Adilson de Almeida Jr    schedule 21.11.2011

Я думаю, что есть много образцов этого, если вы будете искать их. Вот тот, который я обычно использую...

    public static Stream ResizeGdi(Stream stream, System.Drawing.Size size)
    {
        Image image = Image.FromStream(stream);

        int width = image.Width;
        int height = image.Height;

        int sourceX = 0, sourceY = 0, destX = 0, destY = 0;

        float percent = 0, percentWidth = 0, percentHeight = 0;
        percentWidth = ((float)size.Width / (float)width);
        percentHeight = ((float)size.Height / (float)height);

        int destW = 0;
        int destH = 0;

        if (percentHeight < percentWidth)
        {
            percent = percentHeight;
        }
        else
        {
            percent = percentWidth;
        }

        destW = (int)(width * percent);
        destH = (int)(height * percent);

        MemoryStream mStream = new MemoryStream();

        if (destW == 0
            && destH == 0)
        {
            image.Save(mStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            return mStream;
        }

        using (Bitmap bitmap = new Bitmap(destW, destH, System.Drawing.Imaging.PixelFormat.Format48bppRgb))
        {
            using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
            {
                //graphics.Clear(Color.Red);
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.DrawImage(image,
                    new Rectangle(destX, destY, destW, destH),
                    new Rectangle(sourceX, sourceY, width, height),
                    GraphicsUnit.Pixel);
            }

            bitmap.Save(mStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        mStream.Position = 0;
        return mStream as Stream;
    }

Пример кода вызова...

Stream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None);

resizedStream = ImageUtility.ResizeGdi(stream, new System.Drawing.Size(resizeWidth, resizeHeight));
person Wil P    schedule 21.11.2011

Быстрый поиск по проекту кода нашел следующую статью. Это позволяет изменять размер изображений, которые принимают логическое значение, чтобы ограничить новое изображение, чтобы сохранить исходное соотношение сторон. Я не уверен в качестве, так как скриншоты не были предоставлены. См. статью здесь< /а>

person seanzi    schedule 21.11.2011