Member 14150533 Ответов: 2

Как сжать изображения?


Привет, недавно я добавил код в свою программу для сжатия изображений в папке, которая успешно работает. мой вопрос здесь заключается в том, как я могу сжимать изображения по отдельности без необходимости помещать их в папку с помощью моего кода?
вот моя функция:
public static void CompressImage(string sourcepath, string destpath, int quality)
{
    var FileName = Path.GetFileName(sourcepath);
    destpath = destpath + "\\" + FileName;
    using (Bitmap bmpl = new Bitmap(sourcepath))
    {
        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        System.Drawing.Imaging.Encoder QualityEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
        EncoderParameter myEncoderParameter = new EncoderParameter(QualityEncoder, quality);
        myEncoderParameters.Param[0] = myEncoderParameter;
        bmpl.Save(destpath, jpgEncoder, myEncoderParameters);
    }
}

private static ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    foreach(ImageCodecInfo codec in codecs)
    {
        if(codec.FormatID==format.Guid)
        {
            return codec;
        }
    }
    return null;
}

private void button3_Click(object sender, EventArgs e)
{
    string[] files = Directory.GetFiles(textBox1.Text);
    DialogResult result2 = folderBrowserDialog1.ShowDialog();
    if (result2 == DialogResult.OK)
    {
        foreach (var file in files)
        {
            string ext = Path.GetExtension(file).ToUpper();
            if (ext == ".PNG" || ext == ".JPG")
            {
                CompressImage(file, folderBrowserDialog1.SelectedPath, (int)comboBox1.SelectedItem);
            }
            else
            {
                MessageBox.Show("The selected file: " + textBox1.Text + " does not contain no imege.", "Compress Unsuccessfull!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                ClassGV.image = 1;
                break;
            }
        }
        if (ClassGV.image != 1)
        {
            MessageBox.Show("Compressed images has been stored to\n" + folderBrowserDialog1.SelectedPath, "Compress Successfull!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}


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

Ну, я перепробовал много способов сделать свой код правильным, но ни один из них не сработал, так как я не могу точно определить, где я должен измениться, чтобы получить желаемые результаты. Я был бы признателен вам за помощь.

Gerry Schmitz

PNG-файлы уже сжаты; сжатие "снова" не поможет. А некоторые "магазины" настаивают на PNG, поэтому я конвертирую все свои JPG в PNG, которые меньше.

2 Ответов

Рейтинг:
2

OriginalGriff

Имейте в виду, что изображения PNG и JPEG уже сжаты, а в случае файлов JPG это сжатие с потерями. Это означает, что если ваш код сжатия генерирует JPG - файл, он, вероятно, меньше, чем входные данные, потому что в нем меньше информации-а это означает, что вы выбросили детали. Делайте это слишком много раз, и вы действительно заметите! Аналогично, PNG (который является сжатием без потерь) значительно уменьшит размер только за счет удаления информации.

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

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


[no name]

Привет, ну вы правы насчет того, что делает сжатие, но не могли бы вы сказать мне, как вызвать CompressImage для отдельного файла?
Спасибо.

OriginalGriff

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

CompressImage(@"C:\Temp\MyFileToCompress.jpg", "C:\PlaceToPutIt\", aNumber);

* В этом контексте вместо "сжать" следует читать "уничтожить".

[no name]

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

OriginalGriff

Если вы не можете понять, что код делает - и как он это делает - не используйте его!
Если вы не понимаете его, как вы можете быть уверены, что он не устанавливает вирус или вымогателей на вашем компьютере?

Просто "схватить код" - это не лучший способ учиться, и больше, чем "украсть Феррари" - это хороший способ научиться водить машину! Вместо этого возьмите книгу - там есть бесплатные книги, google для "C# yellow book", и вы найдете ее - и пройдите ее от корки до корки. Таким образом, вы не пропустите вещи, которые вам нужно понять, прежде чем перейти к более сложным битам - например, понимание того, как вызвать метод, который вызывается в коде, который вы "нашли"! :смеяться:
Серьезно: курс-это лучший способ учиться, книга-второй, отчаянная надежда на то, что способность волшебным образом снизойдет на вас, - третий, попытка найти видеоурок youtube, который действительно знает, о чем он говорит* это четвертое, а обучение по случайным образцам кода-примерно двести пятьдесят седьмое ...




* Вы не будете, они слишком хорошо скрыты всеми этими дерьмовыми, но один поиск научит вас чему-то.

Рейтинг:
0

#realJSOP

Этот фрагмент кода:

System.Drawing.Imaging.Encoder.Quality
это то, как вы контролируете сжатие. Чем меньше значение, тем ниже разрешение. Допустимые значения-0-100. Если вы заметили, изображение должно быть в памяти (а не в файле), чтобы повлиять на уровень сжатия изображения, а затем вам нужно сохранить его обратно на диск (возможно, с другим именем файла?).

Вот ссылка, которая полностью объясняет свойство и его использование: Кодировщик.Поле Качества (Система.Рисование.Создание Образа) | Майкрософт Документы[^].

Вы действительно должны лучше использовать свое время, научившись пользоваться google. Кроме того, как мы можем помочь вам с чужим кодом, если вы не можете ответить на конкретные вопросы о нем? Если вы не понимаете, что он делает, мы, как правило, не сможем оказать эффективную помощь.