Russian Qt Forum
Ноябрь 27, 2024, 12:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: При сохранении QImage в JPEG искажаются цвета.  (Прочитано 23429 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #30 : Октябрь 11, 2012, 08:16 »

Ну "рекомендовать" легко, а вот просить заказчика изменить ТЗ - куда менее приятно. И это надо мотивировать и знать точно чтобы утверждать "JPG этого не позволяет".
От автора автора темы тут про требования ТЗ  ни слова не было. Про "JPG этого не позволяет" от меня - тоже. Так что то с этими упрёками - не по адресу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Октябрь 11, 2012, 08:55 »

От автора автора темы тут про требования ТЗ  ни слова не было. Про "JPG этого не позволяет" от меня - тоже. Так что то с этими упрёками - не по адресу.
А я никого и не упрекал Улыбающийся По существу вопрос стоит так: "можна" сохранить в jpg 1:1 или "не можна"? То есть да или нет (bool). И вот ответа я что-то не увидел, вместо этого - повторение хорошо известного, мол, jpg хорош для фоток а не... С этим никто не спорит, но ответа-то нет.

А вот XnView при максимальных настройках(DCT Method: Float и SubSampling factor: 1x1,1x1,1x1) 262кб и на глаз неотличимо от оригинала.
Ну так "не на глаз" все же отличимо - значит непринципиально. Предлагаю подытожить так

- средствами Qt сохранение в jpg 1:1 недостижимо. Другими - также проблематично.
Записан
alexman
Гость
« Ответ #32 : Октябрь 11, 2012, 08:57 »

Еще кидаю файлы. bmp2.bmp - соотв-ет действительности, jpg2.jpg - не соотв-ет.
Ты точно устанавливаешь 100% качество? Ибо у меня при 100% качестве получается 248кб, а при дефолтном 116кб как у тебя. А вот XnView при максимальных настройках(DCT Method: Float и SubSampling factor: 1x1,1x1,1x1) 262кб и на глаз неотличимо от оригинала. Так что либо лезть в недры кьюта и добавлять возможность менять DCT Method и SubSampling factor, либо взять стороннюю библиотеку которая поддерживает такую тонкую настройку.
Код
C++ (Qt)
   QImage image;
   QString in = QFileDialog::getOpenFileName( this, "Open image", qApp->applicationDirPath(), "Image Files (*.png *.jpg *.bmp)" );
   if( in.isEmpty() ) return;
   if( !image.load( in ) ) return;
   QString out = QFileDialog::getSaveFileName( this, "Save image", qApp->applicationDirPath(), "JPEG (*.jpeg)" );
   if( out.isEmpty() ) return;
   image.save( out, "JPEG", 100 );
100%
Записан
V1KT0P
Гость
« Ответ #33 : Октябрь 11, 2012, 09:20 »

Ну так "не на глаз" все же отличимо - значит непринципиально. Предлагаю подытожить так

- средствами Qt сохранение в jpg 1:1 недостижимо. Другими - также проблематично.
Что ты так пессимистично говоришь. Если предполагается использование jpeg, то явно разработчик знает про потерю качества. Но можно добиться максимального качества, когда на глаз неотличимо. И про то что другими средствами проблематично тоже глупость. В аттаче оригинал и jpeg созданный XnView. На глаз ты вообще не увидишь изменений, ибо там погрешность в 1 уровень на канал для 90%, для остальных 10% не больше 5 уровней на один канал. Для сравнения у jpeg сжатый кьютами погрешность до 85 уровней на канал, разница таки большая. И jpeg созданный XnView еще и не так много занимает места, кстати там еще вроде можно попробовать увеличить качество путем отключения всяких оптимизаций под максимальное сжатие.
Записан
alexman
Гость
« Ответ #34 : Октябрь 11, 2012, 09:46 »

Ну так "не на глаз" все же отличимо - значит непринципиально. Предлагаю подытожить так

- средствами Qt сохранение в jpg 1:1 недостижимо. Другими - также проблематично.
Что ты так пессимистично говоришь. Если предполагается использование jpeg, то явно разработчик знает про потерю качества. Но можно добиться максимального качества, когда на глаз неотличимо. И про то что другими средствами проблематично тоже глупость. В аттаче оригинал и jpeg созданный XnView. На глаз ты вообще не увидишь изменений, ибо там погрешность в 1 уровень на канал для 90%, для остальных 10% не больше 5 уровней на один канал. Для сравнения у jpeg сжатый кьютами погрешность до 85 уровней на канал, разница таки большая. И jpeg созданный XnView еще и не так много занимает места, кстати там еще вроде можно попробовать увеличить качество путем отключения всяких оптимизаций под максимальное сжатие.
GIMP практически 1:1 сохраняет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Октябрь 11, 2012, 10:11 »

Ну так "не на глаз" все же отличимо - значит непринципиально. Предлагаю подытожить так

- средствами Qt сохранение в jpg 1:1 недостижимо. Другими - также проблематично.
Что ты так пессимистично говоришь. Если предполагается использование jpeg, то явно разработчик знает про потерю качества. Но можно добиться максимального качества, когда на глаз неотличимо. И про то что другими средствами проблематично тоже глупость. В аттаче оригинал и jpeg созданный XnView. На глаз ты вообще не увидишь изменений, ибо там погрешность в 1 уровень на канал для 90%, для остальных 10% не больше 5 уровней на один канал. Для сравнения у jpeg сжатый кьютами погрешность до 85 уровней на канал, разница таки большая. И jpeg созданный XnView еще и не так много занимает места, кстати там еще вроде можно попробовать увеличить качество путем отключения всяких оптимизаций под максимальное сжатие.
Специально процитировал полностью. Витя, какие же глупости я сказал? Улыбающийся Вам удалось сохранить в jpg 1:1 т.е. "байт в байт"? Сами пишете что нет, хотя Вы могли использовать любой софт. Ладно, Вы хотя бы показали как в Qt добиться "приемлемого" результата, не говоря о "точном"? Тоже нет, и Вы тоже сами об этом пишете. Программист Вы конечно творческий/инициативный, но уж очень любите лезть нахрапом Улыбающийся

GIMP практически 1:1 сохраняет.
Около года назад я цеплял lbJpeg - ну конечно "не хуже др либов", но забот на 2 платформах хватило с избытком. Вам lbJpeg не подойдет, так что забот будет больше. Чего Вы уперлись в этот jpg? Ну очевидно что здесь он совсем нехорош, почему не использовать прекрасный png?
Записан
alexman
Гость
« Ответ #36 : Октябрь 11, 2012, 10:22 »

Чего Вы уперлись в этот jpg? Ну очевидно что здесь он совсем нехорош, почему не использовать прекрасный png?
Сохраняю по ТЗ в различные форматы. Увы, но jpg убрать нельзя. Надо хотя бы добиться, чтобы видимо практически не отличалось.
Записан
alexman
Гость
« Ответ #37 : Октябрь 11, 2012, 11:03 »

В общем буду пробовать использовать другую либу для этих целей. Подскажите, пожалуйста, кросс-платформенную либу!?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Октябрь 11, 2012, 12:01 »

В общем буду пробовать использовать другую либу для этих целей. Подскажите, пожалуйста, кросс-платформенную либу!?
А может просто договориться с заказчиком - ну так, мол, и так - такой формат, для этих целей не предназначен, как сохраняет - так и сохраняет.  Или совсем уж заказчик-зверь попался?  Улыбающийся

Возникла экспериментальная (возможно глупая) мысль. А если так: сохранить, прочитать, сравнить. Докрутить цвета "в доугую сторону" - опять сохранить. Возможно повторить. Ну понятно если цвет 255 - то крутить уже некуда. Это несложно сделать и может будет дешевле чем мудохаться с либой (эдак с месяц)

Ну а если "принципиально" - гуглите "lossless jpeg"
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #39 : Октябрь 11, 2012, 18:21 »

Цитировать
Так что, выходит что jpg не умеет сохранять lossless (без потери квачества)? Бред собачий, конечно умеет.
К концу дня будет время, посмотрю файло

Никогда jpeg не был lossless кодеком. "Качество 100%" - это значит минимально возможные потери / максимальный размер данных, а не lossless.
Записан
V1KT0P
Гость
« Ответ #40 : Октябрь 11, 2012, 21:36 »

Специально процитировал полностью. Витя, какие же глупости я сказал? Улыбающийся Вам удалось сохранить в jpg 1:1 т.е. "байт в байт"? Сами пишете что нет, хотя Вы могли использовать любой софт. Ладно, Вы хотя бы показали как в Qt добиться "приемлемого" результата, не говоря о "точном"? Тоже нет, и Вы тоже сами об этом пишете. Программист Вы конечно творческий/инициативный, но уж очень любите лезть нахрапом Улыбающийся
А автору и не требуется 1:1 сохранить, ему надо чтобы не было сильных визуальных искажений. У меня нет желания и времени искать jpeg либу и разбираться с ней, тем более что оно мне не нужно. Я указал в какую сторону надо копать: DCT Method: Float и SubSampling factor: 1x1,1x1,1x1.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Октябрь 12, 2012, 10:04 »

Никогда jpeg не был lossless кодеком. "Качество 100%" - это значит минимально возможные потери / максимальный размер данных, а не lossless.
Это подтверждается тем что я проверил (отвечая в этой теме). Но как быть с многочисленными упоминаниями о lossless в гугле, более того, опциями в очень приличных приложениях? (attach)
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #42 : Октябрь 12, 2012, 11:34 »

Никогда jpeg не был lossless кодеком. "Качество 100%" - это значит минимально возможные потери / максимальный размер данных, а не lossless.
Это подтверждается тем что я проверил (отвечая в этой теме). Но как быть с многочисленными упоминаниями о lossless в гугле, более того, опциями в очень приличных приложениях? (attach)

Jpeg работает с цветовым пространством YUV.

В нем же идет транляция цифрового телесигнала и вообще всё видео в YUV.
Там вместо 3-х привычных нам компонент (R, G, B) есть 2 компоненты: Y - luma (яркость), UV - хрома - цветорастностная компонента.

Конвертация RGB<->YUV не проходит без потерь, т.к. размеры этих пространств разные.

P.S. Сабсэмплинг 4:4:4 - это хорошо, в подавляющем большинстве случаев используется другой, при нем потери еще больше (т.е. яркость задается для каждого пикселя, в цвет - одно значение на 2 или 4 пикселя), но для человеческого это как правило незаметно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Октябрь 12, 2012, 11:45 »

Jpeg работает с цветовым пространством YUV...
Читал это где-то в середине 90-х Улыбающийся Конечно все Вы правильно написали, но вот ответа на мой вопрос почему-то не даете  Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #44 : Октябрь 12, 2012, 11:55 »

Но как быть с многочисленными упоминаниями о lossless в гугле
Возможно тем, что jpeg (Joint Photographic Experts Group) разработал далеко не один кодек и беспотерьные среди них были. Вот только распространения они не получили.
Ну и вариант, что гугл нашёл результаты "jpeg is not lossless" тоже исключать нельзя. Смеющийся

Но как быть с многочисленными упоминаниями о lossless в гугле, более того, опциями в очень приличных приложениях?
И каков результат? Действительно беспотерьный? А другими программами такой файл открывается?

vipet, насколько я знаю, пространство может быть разное, просто YUV - вариант по умолчанию.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 23.