Изменение размера изображения JPEG в C # уменьшает его разрешение - PullRequest
3 голосов
/ 18 января 2012

Что у меня есть:

   A JPEG image with 96dpi, size: 540 X 700

Что я хочу: JPEG изображение с разрешением 300 точек на дюйм, размер: 771 X 1000

Проблема: Когда я сначала изменяю размер изображения, а затем пытаюсь изменить разрешение, с помощью следующего кода это не работает

       /// <summary>
    /// Changes the resolution of the image
    /// </summary>
    /// <param name="imgPath">Image Path</param>
    /// <param name="xResolution">x Resolution</param>
    /// <param name="yResolution">y Resolution</param>
    /// <returns>Modified Image Path</returns>
    private string ChangeResolution(string imgPath, int xResolution, int yResolution)
    {
        string fullFileName = Path.GetFileNameWithoutExtension(imgPath);
        string extension = Path.GetExtension(imgPath);
        string tmpFileSavedPath = outputDir + "\\" + fullFileName + "_." + extension + "_tmp";

        Image original = Bitmap.FromFile(imgPath);
        original.Save(tmpFileSavedPath);

        Bitmap bmSmall = new Bitmap(tmpFileSavedPath);
        bmSmall.SetResolution(xResolution, yResolution);
        string modifiedOverLayImagePath = tmpFileSavedPath.TrimEnd("_tmp".ToCharArray());
        bmSmall.Save(modifiedOverLayImagePath);
        bmSmall.Dispose();

        //Deleting temp file
        System.IO.File.Delete(tmpFileSavedPath);
        return modifiedOverLayImagePath;
    }

означает, что он ничего не делает с изображением, разрешение остается тем же, если я иду другим путем, то есть сначала изменяю разрешение, а затем изменяю размер, неожиданно размер изменяется, но разрешение уменьшается до 96 dpi.

Вот код изменения размера:

public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height)
    {
        //a holder for the result
        Bitmap result = new Bitmap(width, height);

        //use a graphics object to draw the resized image into the bitmap
        using (Graphics graphics = Graphics.FromImage(result))
        {
            //set the resize quality modes to high quality
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //draw the image into the target bitmap
            graphics.DrawImage(image, 0, 0, result.Width, result.Height);
        }

        //return the resulting bitmap
        return result;
    }

Кто-нибудь может мне помочь, мне интересно, если 771 X 1000 поддерживает разрешение 300 точек на дюйм, но когда я делаю это в фотошопе, это работает отлично, спасибо

Ниже приводится моя основная функция, в которой я сначала изменяю разрешение, а затем изменяю размер:

string imgPath = @"D:\abc\background.jpg";

        string newResPath = ChangeResolution(imgPath, 300, 300);

        Image oldImage = Bitmap.FromFile(newResPath);
        //Image newImage = ImageResize.ConstrainProportions(oldImage, 771, ImageResize.Dimensions.Width);
        Image newImage = ImageUtilities.ResizeImage(oldImage, 771, 1000);
        string savedPath = "D:\\abc\\saved.jpg";

        try
        {
            newImage.Save(savedPath, ImageFormat.Jpeg);
        }
        catch
        {
            MessageBox.Show("error");
        }
        newImage.Dispose();

Ответы [ 3 ]

2 голосов
/ 05 апреля 2013
private static Bitmap _resize(Image image, int width, int height)
{
    Bitmap newImage = new Bitmap(width, height);
    //this is what allows the quality to stay the same when reducing image dimensions
    newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    using (Graphics gr = Graphics.FromImage(newImage))
    {
        gr.SmoothingMode = SmoothingMode.HighQuality;
        gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
        gr.DrawImage(image, new Rectangle(0, 0, width, height));
    }
    return newImage;
}
1 голос
/ 18 января 2012

Реальное разрешение JPEG - это определенная ширина по высоте пикселей - это то, что действительно имеет значение. Таким образом, действительно важным шагом является ImageUtilities.ResizeImage для более нового разрешения.

Поле разрешения DPI носит исключительно информационный характер и дает своего рода подсказку о том, насколько большой исходный пиксель был на первом месте. Таким образом, после изменения размера пикселей вы должны обновить поле DPI до того значения, которое, по вашему мнению, должно быть.

0 голосов
/ 18 января 2012

Короче говоря, DPI не важен в этом случае

Приятно объяснил этот ответ .

DPI обозначает точек на дюйм . Одна подсказка относительно сброса 96dpi взята из Википедии:

... многие программы для Windows были написаны с 1980-х годов для предположения, что экран обеспечивает 96 PPI

На самом деле ваш экран будет отображать ваше изображение с разрешением, а DPI (или PPI, Pixels Per Inch) определяется размером вашего экрана. DPI действительно включается только при печати изображения.

В зависимости от того, какое устройство вы печатаете в DPI, будет различаться.

...