Abuamer Ответов: 4

Как уменьшить размер изображения без потери качества


у меня есть настольное приложение c#, которое я создал для хранения изображений в базе данных SQL server
Проблема в том ,что код работает правильно и изображения хранятся разными способами, но с большим размером,поэтому я попытался изменить размер изображений перед сохранением,но мой метод изменения размера не помогает. вопрос ,
можно ли таким образом уменьшить размер без потери качества

Что я уже пробовал:

private void barBtnOpenPhotos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            // there is where the user load's images
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "JPG|*.jpg|JPEG|*.jpeg|PNG|*.png|Tif|*.tif";
            ofd.Multiselect = true;
            ofd.ShowDialog();
            string[] files = ofd.FileNames;
            // here  i create adatagridview to load multiple images 
            DataGridViewImageColumn img = new DataGridViewImageColumn();
            img.HeaderText = "ImageSelect";
            img.Name = "PhotoImage";
            img.ImageLayout = DataGridViewImageCellLayout.Stretch;
            datagridview_Images.Columns.Add(img);
            //here i view images inside 
            datagridview_Images.Rows.Clear();
            foreach (string filename in files)
            {
                Image image = Image.FromFile(filename);
//this is the method that's resize images
                image = reesizeImage(image, new Size(1024, 576)); 
                datagridview_Images.Rows.Add(image);
            }
        }
private static Image reesizeImage(Image imgToResize, Size size)
        {
            int sourceWidth = imgToResize.Width;
            int sourceHeight = imgToResize.Height;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)size.Width / (float)sourceWidth);
            nPercentH = ((float)size.Height / (float)sourceHeight);

            if (nPercentH < nPercentW)
                nPercent = nPercentH;
            else
                nPercent = nPercentW;

            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;
        }

4 Ответов

Рейтинг:
33

TheRealSteveJudge

is this possible to reduce the size without losing quality

Ответ - "Нет".

Уменьшение размера изображения означает уменьшение содержащейся в нем информации.

Пожалуйста, взгляните на Понимание Интерполяции Цифровых Изображений[^]

Там говорится: "изображение всегда будет терять некоторое качество каждый раз, когда выполняется интерполяция"


Maciej Los

5ed!

TheRealSteveJudge

Спасибо тебе, Мацей!

Рейтинг:
28

CPallini

Цитата:
"без потери какого-либо качества"
Это очень строгое требование и TheRealSteveJudge это верно, вы не можете удовлетворить его.

Однако если вы ослабите такое требование и примете потерю некоторого качества, то взгляните на Тинка Либор по "Изменение размера изображения - превзойти в GDI+"[^].


Maciej Los

5ed!

TheRealSteveJudge

5*

Рейтинг:
20

OriginalGriff

Существует две формы "уменьшенного размера": размер файла, который иногда может быть уменьшен без потери качества; и разрешение, которое не может быть уменьшено.

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

Разрешение не может быть уменьшено без ущерба для качества, потому что вы должны выбросить информацию, чтобы уменьшить разрешение. Подумайте об этом: уменьшение изображения с 4x4 до 2x2 означает, что каждый пиксель в целевом изображении представляет собой амальгаму из четырех пикселей от оригинала:

1122  --->>  12
1122         34
3344
3344
И информация в источнике не может быть восстановлена из одного пикселя в результате, независимо от того, что вы видите в NCIS, CSI и Blade Runner! Его можно аппроксимировать ссылкой на окружающие пиксели, когда вы "увеличиваете" его, но как только эта информация исчезает, она исчезает навсегда.


Maciej Los

5ed!

TheRealSteveJudge

5*

Рейтинг:
11

Patrice T

Цитата:
Как уменьшить размер изображения без потери качества

Общий ответ таков ты не можешь.
Единственный случай, когда "вы можете", - это когда у вас есть несжатое изображение (.bmp) и вы меняете формат на сжатый (.gif,. png ...).
Помимо этого, все операции, которые вы делаете, теряют качество.
- Понижающее масштабирование по определению удаляет информацию, тем самым теряя качество.
- Уменьшение цветовой схемы по определению означает удаление информации, что приводит к потере качества.
- Паршивое сжатие (.jpeg) по определению удаляет информацию, тем самым теряя качество.

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


TheRealSteveJudge

5*

Patrice T

Спасибо

Abuamer

не могли бы вы помочь мне с преобразованием изображений в jpg frmat перед их сохранением? внутри моего метода выше.. спасибо