Изменить размер файла JPEG в C # - PullRequest
3 голосов
/ 01 января 2012

Мне нужно передать некоторые изображения по сети, я сохранил изображения в формате Jpeg и 40% качества следующим образом:

public void SaveJpeg(string path, Image image, int quality) {
        if((quality < 0) || (quality > 100)) {
            string error = string.Format("Jpeg image quality must be
 between 0 and 100, with 100 being the highest quality.  A value of {0} was
 specified.", quality);
            throw new ArgumentOutOfRangeException(error);
        }
        EncoderParameter qualityParam = new
 EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
        ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
        EncoderParameters encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = qualityParam;
        image.Save(path, jpegCodec, encoderParams);
    }

Но при этом размер файлов Jpeg недостаточно мал, также я изменяюкачество, но это не очень хорошая внешность.Есть ли способ сохранить изображения с меньшим размером файла и правильным внешним видом?Я не знаю, но есть ли способ использовать объект System.Drawing.Graphics, также мне не нужно архивировать файлы или изменять размер изображений, сейчас важен только размер файла изображения.

Ответы [ 2 ]

2 голосов
/ 01 января 2012

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

С другой стороны, файлы PNG без потерь, но все же могут привести к большим файлам. Вы можете попробовать кодировать файл в формате PNG, используя PngBitmapEncoder . Это обеспечит высокое качество, но размер может уменьшиться или не уменьшиться для вашей программы (зависит от изображения).

Если вы выполняете это на локальном компьютере и вам не нужно делать это слишком часто (например, для многих одновременно работающих пользователей), вы можете вызвать внешнюю программу, чтобы сделать это для вас. PNG Monster очень хорошо сжимает файлы PNG без снижения качества. Вы можете вызвать это из вашей программы и отправить полученный файл PNG. (Вы можете проверить условия лицензирования, чтобы убедиться, что они совместимы с вашей программой).

Существует не так много способов, с помощью которых вы можете поддерживать высокое качество и одновременно выполнять высокое сжатие, не манипулируя изображением (например, изменяя размер).

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

У меня есть метод для создания и сохранения эскиза загруженного изображения, я думаю, NewImageSize метод может помочь вам. Он также решает проблему качества.

public Size NewImageSize(int OriginalHeight, int OriginalWidth, double FormatSize)
        {
            Size NewSize;
            double tempval;

            if (OriginalHeight > FormatSize && OriginalWidth > FormatSize)
            {
                if (OriginalHeight > OriginalWidth)
                    tempval = FormatSize / Convert.ToDouble(OriginalHeight);
                else
                    tempval = FormatSize / Convert.ToDouble(OriginalWidth);

                NewSize = new Size(Convert.ToInt32(tempval * OriginalWidth), Convert.ToInt32(tempval * OriginalHeight));
            }
            else
                NewSize = new Size(OriginalWidth, OriginalHeight); return NewSize;
        } 

        private bool save_image_with_thumb(string image_name, string path)
        {

                ResimFileUpload1.SaveAs(path + image_name + ".jpg"); //normal resim kaydet



            ///////Thumbnail yarat ve kaydet//////////////
            try
            {
                Bitmap myBitmap;

                myBitmap = new Bitmap(path + image_name + ".jpg");

                Size thumbsize = NewImageSize(myBitmap.Height, myBitmap.Width, 100);

                System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

                // If jpg file is a jpeg, create a thumbnail filename that is unique.

                string sThumbFile = path + image_name + "_t.jpg";

                // Save thumbnail and output it onto the webpage

                System.Drawing.Image myThumbnail = myBitmap.GetThumbnailImage(thumbsize.Width, thumbsize.Height, myCallBack, IntPtr.Zero);

                myThumbnail.Save(sThumbFile);

                // Destroy objects
                myThumbnail.Dispose();
                myBitmap.Dispose();

                return true;
            }
            catch //yaratamazsa normal ve thumb iptal
            {
                return false;
            }
            ///////////////////////////////////

        }
...