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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: При сохранении QImage в JPEG искажаются цвета.  (Прочитано 22197 раз)
V1KT0P
Гость
« Ответ #15 : Октябрь 10, 2012, 09:16 »

Кидаю файлы.
Как по мне так это из за слишком большого коэффициента сжатия. А там где ты сравниваешь в просмотрщике вообще масштаб не выдержан.
Записан
alexman
Гость
« Ответ #16 : Октябрь 10, 2012, 09:24 »

Кидаю файлы.
Как по мне так это из за слишком большого коэффициента сжатия. А там где ты сравниваешь в просмотрщике вообще масштаб не выдержан.
Тыкалка, я же писал уже, что все доступные коэффициенты (compression, quality, gamma) уже пробовал подгонять...не помогло.
Записан
alexman
Гость
« Ответ #17 : Октябрь 10, 2012, 09:28 »

Еще кидаю файлы. bmp2.bmp - соотв-ет действительности, jpg2.jpg - не соотв-ет.
Записан
lighting
Гость
« Ответ #18 : Октябрь 10, 2012, 09:38 »

попробуй в png сохранить и сравнить результат, мне кажется что после этого все встанет на свои места
Записан
alexman
Гость
« Ответ #19 : Октябрь 10, 2012, 09:45 »

попробуй в png сохранить и сравнить результат, мне кажется что после этого все встанет на свои места
C png как раз все ок. Кидаю еще раз файлы.
Записан
lighting
Гость
« Ответ #20 : Октябрь 10, 2012, 10:04 »

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

Сообщений: 11445


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

собственно о чем я и говорил. jpg не очень предназначен для хранения изображений с областями одного цвета и резкими границами между цветами, для этого предназначен gif и png. jpg же пытается смазать эти границы из-за чего скорее всего и происходит изменение цвета, да и границы цветов размываются, теряется четкость изображения.
jpg это обязательное требование тз? Ведь даже по размеру получившегося файла видно что png подходит гораздо больше.
Так что, выходит что jpg не умеет сохранять lossless (без потери квачества)? Бред собачий, конечно умеет.
К концу дня будет время, посмотрю файло
Записан
vic_prog
Гость
« Ответ #22 : Октябрь 10, 2012, 10:52 »

собственно о чем я и говорил. jpg не очень предназначен для хранения изображений с областями одного цвета и резкими границами между цветами, для этого предназначен gif и png. jpg же пытается смазать эти границы из-за чего скорее всего и происходит изменение цвета, да и границы цветов размываются, теряется четкость изображения.
jpg это обязательное требование тз? Ведь даже по размеру получившегося файла видно что png подходит гораздо больше.
Так что, выходит что jpg не умеет сохранять lossless (без потери квачества)? Бред собачий, конечно умеет.
К концу дня будет время, посмотрю файло
Сама технология записи в jpg подразумевает потерю качества (сравни побитово изображения). Другое дело, что есть разные алгоритмы, которые пытаются сделать эту потерю не видимой глазу (видать по умолчанию в Qt реализован не самый лучший алгорима). Такое изображение лучше сжимать png, tiff или pcx (форматы, которые умеют сжимать без потери качесва). К примеру, на png у тебя получился самый минимальный результирующий размерю
Записан
lighting
Гость
« Ответ #23 : Октябрь 10, 2012, 11:39 »

Так что, выходит что jpg не умеет сохранять lossless (без потери квачества)? Бред собачий, конечно умеет.
Умеет, но на мой взгляд для сохранения подобных изображений png больше подходит, потому и спросил про тз. Хотя куда уж нам, раз сам Igors сказал что это бред...
К концу дня будет время, посмотрю файло
Тут код смотреть надо, т.к. на словах топикстартер уже сказал что качество крутил по всякому.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Умеет, но на мой взгляд для сохранения подобных изображений png больше подходит, потому и спросил про тз. Хотя куда уж нам, раз сам Igors сказал что это бред...
Ну резковато сказал Улыбающийся Но ведь елы-палы, не раз видел в гугле что есть. Ладно, разберемся
Записан
lighting
Гость
« Ответ #25 : Октябрь 10, 2012, 12:15 »

Ну резковато сказал Улыбающийся Но ведь елы-палы, не раз видел в гугле что есть. Ладно, разберемся
Да есть, есть - никто не спорит. В Википедии про это написано, просто там кроме всего прочего вот такой текст есть:
Цитата: Wikipedia
Алгоритм JPEG в наибольшей степени пригоден для сжатия фотографий и картин, содержащих реалистичные сцены с плавными переходами яркости и цвета. Наибольшее распространение JPEG получил в цифровой фотографии и для хранения и передачи изображений с использованием сети Интернет.
С другой стороны, JPEG малопригоден для сжатия чертежей, текстовой и знаковой графики, где резкий контраст между соседними пикселами приводит к появлению заметных артефактов. Такие изображения целесообразно сохранять в форматах без потерь, таких как TIFF, GIF или PNG.
пруфлинк
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Да есть, есть - никто не спорит.
Ну так если "есть" - то чего же не сохраняет? Ладно, не буду попусту препираться, по теме:

- Qt использует libJpeg (самую популярную реализацию) которая НЕ обеспечивает lossless (даже с задаваемым качеством 100%) http://stackoverflow.com/questions/7982409/is-jpeg-lossless-when-quality-is-set-to-100

Дополнительно: набросал утилитку для сравнения картинок "байт в байт" (интересно - выложу) и проверил 2 приложения которые обещают сохранение без потерь

- GraphicsConverter (Mac)
- RealWorld Photos (Вындоуз)

Сохраненные картинки отличаются (никакого lossless не наблюдаю)


Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



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

Что-то я не понял - а какой собственно смысл пытаться сжать такие картинки JPEG? Он же совершенно для этого не предназначен и при любых раскладах для такой картинки будет сжимать хуже, чем png, gif и даже pcx c RLE? Для сравнения исходный файл (BMP 3 104 694 Байта) в:
PCX - 128868 Байт,
GIF - 7 684 Байта,
PNG - 7 375 Байт.
JPEG c 75% качеством - 85 659 Байт.
Ну и PNG при этом будет без искажений, JPEG - с искажениями, в том числе колористическими.
Для справки:
ZIP - 7 690 Байт,
7Z Ultra - 2 374 Байт (!!!!).
Настоятельно рекомендую избавиться от JPEG для таких картинок.
« Последнее редактирование: Октябрь 10, 2012, 16:18 от xokc » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Настоятельно рекомендую избавиться от JPEG для таких картинок.
Ну "рекомендовать" легко, а вот просить заказчика изменить ТЗ - куда менее приятно. И это надо мотивировать и знать точно чтобы утверждать "JPG этого не позволяет". Так что смысл в обсуждении есть/был
Записан
V1KT0P
Гость
« Ответ #29 : Октябрь 10, 2012, 20:34 »

Еще кидаю файлы. 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 );
« Последнее редактирование: Октябрь 11, 2012, 08:42 от V1KT0P » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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