powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с изображениями. Копирование без потерь.
14 сообщений из 14, страница 1 из 1
Работа с изображениями. Копирование без потерь.
    #38901175
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые форумчане. Возникла следующая проблема при работе с изображениями.
Загружается одно большое изображение и потом оно ужимаеться на более мелкие и в конце создается битмап с размеров оригинального изображения и в него копируется изображения и сохраняется.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using (Graphics graphic = Graphics.FromImage((Image)bitmap))
                {
                    graphic.CompositingQuality = CompositingQuality.HighQuality;
                    graphic.SmoothingMode = SmoothingMode.HighQuality;
                    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    //graphic.DrawImage((Image)bitmap, 0, 0, bitmap.Width, bitmap.Height);

                    Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                    graphic.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
                }
bitmap.Save(String.Format("{0}{1}", path, imageName), ImageFormat.Jpeg);


После сохранения картинка становится в 2 раза меньше.
Может кто-то сталкивался с таким? По хорошему после сохранения картинка должна быть примерно такого же рамера как и оригинальная.
Проблема как я понимаю в сжатии изображения, но как определить какой уровень сжатия в исходного изображения?
Помогите решить проблему.
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901218
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так же пробовал использовать Encoder для jpeg формата:
Код: c#
1.
2.
3.
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)95);


Поигравшись с уровнем компресси, определил что он должен быть установлен в 95 для того что размер изображения исходного приблизительно соответствовало выходному изображению.
Но этот способ мне показался не очень красивым. Может кто-то знает способ по лучше?
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901284
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t_e_m_a
Код: c#
1.
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);


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

Преобразуйте в png, или зипуйте исходный массив байт
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901296
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторАлгоритм Jpeg по умолчанию предполагает ухудшение качества изображения. Поэтому преобразование в Jpeg и обратно приведет к тому, что итоговый файл будет меньше размером, чем исходный. Насколько - определяется уровнем сжатия.

Преобразуйте в png, или зипуйте исходный массив байт
По чему тогда когда я уровень сжатия ставлю в 100 то размер файла выростает в 2 раза? А если без преобразований, можно как-то скопировать изображение?
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901303
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t_e_m_aПо чему тогда когда я уровень сжатия ставлю в 100 то размер файла выростает в 2 раза?как вариант - исходный файл содержит индексированную палитру. А jpeg пережимает в 24-битный цвет
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901316
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторкак вариант - исходный файл содержит индексированную палитру. А jpeg пережимает в 24-битный цвет
Так исходный файл тоже jpeg. Пробовал менять 24 на 32 -бит на цвет но на размер это никак не влияет.
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901337
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t_e_m_aно как определить какой уровень сжатия в исходного изображения?
5552857
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901357
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал этот вариант с разными изображениями и в результате размер исходного изображения равен выходному.
Но хотелось бы как-то красивее это сделать.
авторТак же пробовал использовать Encoder для jpeg формата:
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)95);
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901375
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор5552857
спасибо огромное.
Но такой способ врядли мне подойдет. Так как приложение не ориентировано на обработку изображений.
Скорее всего придется ставить уровень сжатия в 95 для всех jpeg изображений.
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901458
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все таки этот способ не совсем хорош, в некоторых случаях дает плохой результат
Код: c#
1.
2.
3.
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)95);


Может кто знает другой способ?
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901603
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
t_e_m_a,

ты явно не к тому стремишься. Размер при сжатии очень сильно зависит от сжимаемого содержимого.

Создай в Пайнте пустое изображение залитое белым цветом, сохрани в jpg. Размер будет всего несколько килобайт.
Теперь нарисуй что-нибудь на этом фоне, просто поводи пером. Сохрани в jpg. Размер будет намного больше, десятки килобайт.
Размер файла jpg очень сильно зависит от самого рисунка.
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901609
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторt_e_m_a,

ты явно не к тому стремишься. Размер при сжатии очень сильно зависит от сжимаемого содержимого.

Создай в Пайнте пустое изображение залитое белым цветом, сохрани в jpg. Размер будет всего несколько килобайт.
Теперь нарисуй что-нибудь на этом фоне, просто поводи пером. Сохрани в jpg. Размер будет намного больше, десятки килобайт.
Размер файла jpg очень сильно зависит от самого рисунка.
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901619
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про содержимое рисунка это все понятно, я ж не сжимаю.
Я просто копирую изображение. А в результате получаю либо файл в 2-а раза больше либо меньше.
Толко что попробовал скопировать изображение таким образом
Код: c#
1.
2.
3.
4.
5.
6.
7.
sing (System.IO.FileStream fileStream = new System.IO.FileStream(@originalImagePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                using (Bitmap bitmapImage = (Bitmap)Image.FromStream(fileStream))
                {
                    bitmapImage.Save(resultPath, ImageFormat.Jpeg);
                }
            }


Но все равно входной файл отличается от выходного на 30 кб. Как такое может быть?
...
Рейтинг: 0 / 0
Работа с изображениями. Копирование без потерь.
    #38901661
t_e_m_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (System.IO.FileStream fileStream = new System.IO.FileStream(@originalImagePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                using (Bitmap bitmapImage = (Bitmap)Image.FromStream(fileStream))
                {
                    bitmapImage.Save(resultPath);
                }
            }


Кто-то может объяснить по чему при таком способе копирования изображения все равно отличаются по размеру?
За ранее спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с изображениями. Копирование без потерь.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]