C# - Как изменить качество PNG или глубину цвета

Я, как предполагается, пишу программу, которая получает некоторые изображения PNG от пользователя, делает некоторые простые редактирования как вращение и сохраняет их в файле JAR так, чтобы оно могло использовать изображения в качестве ресурсов. Проблема состоит в том, когда я открываю, говорю, что 80 КБ отображают и затем сохраняют ее с C#, я получаю изображение с тем же качеством, но для 130 КБ пространства. И потому что это должно войти в файл банки J2ME, я действительно должен понизить размеры, по крайней мере, первоначальный размер. Я попробовал код ниже, но позже узнал, что он только работает на изображения Jpeg.

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                Image im;
                im = pictureBox1.Image;
                im.Save(address , codecs[j], CodecParams);

Это - то, где изображение загружается в поле изображения:

private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string address = openFileDialog1.FileName;
                address.Replace("\\", "\\\\");
                Image im = Image.FromFile(address);
                pictureBox1.Image = im;
            }
        }

И это - то, где это сохраняется назад без редактирований:

private void generateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {

                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                string address = folderBrowserDialog1.SelectedPath;
                address = address + "\\";
                address.Replace("\\", "\\\\");

                Image im;
                im = pictureBox1.Image;               
                im.Save(address + imageFileNames[1], codecs[j], CodecParams);

Примечание: imageFileNames [] является просто массивом строк, который имеет часть из имена файлов, к которым образы должны быть сохранены с.

Любые идеи будут цениться и заранее спасибо.

13
задан Auxiliary 10 March 2010 в 18:38
поделиться

1 ответ

Я взял 4 разных PNG размером от 2 КБ до 2,6 МБ. Используя ваш код, я загружаю их и сохраняю. Я не модифицирую изображение, поворачивая или переворачивая его. Все 4 PNG при повторном сохранении имеют точно такой же размер.

Кроме того, я взял 2,6 МБ PNG, открыл его в Photoshop и сохранил две его копии, одну с чересстрочной разверткой (уменьшено до 2,06 МБ), одну с нечесстрочной разверткой (уменьшено до 1,7 МБ). Затем я взял каждую из те, прогнали их через ваш код и сохранили. В результате оба размера вернулись к исходным 2,6 МБ.

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

Я возился с EncoderParameter для сжатия, но, похоже, это не повлияло.

11
ответ дан 1 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: