May 15th, 2007

nyaload

(no subject)

В продолжение предыдущего поста. Save For Web в фотошопе показывает "честную картинку", но практически все приложения показывают jpeg при помощи libjpeg. В котором по умолчанию включён deblocking-фильтр:
boolean do_block_smoothing
	If TRUE, interblock smoothing is applied in early stages of decoding
	progressive JPEG files; if FALSE, not.  Default is TRUE.  Early
	progression stages look "fuzzy" with smoothing, "blocky" without

boolean do_fancy_upsampling
	If TRUE, do careful upsampling of chroma components.  If FALSE,
	a faster but sloppier method is used.  Default is TRUE.


Вот на этой картинке

ваш браузер скорее всего покажет размытые границы у квадратов (можете скопировать и посмотреть в mspaint/whatever в увеличеном виде). Хотя на самом деле если бы не этот фильтр, то были бы четкие квадраты (положение и размер квадратов специально подобрано под размер блоков, которые независимо сжимает JPEG, 16x16).

Вот как это выглядит:
Collapse )
Первая - пожатая в jpeg и декомрессированная, вторая - оригинальная. Рядом - то же самое, увеличеное в 5 раз.

Наткнулся я на это поскольку пытаюсь сейчас хитро оптимизировать jpeg-графику.

updated: настоящим виновником оказался do_fancy_upsampling (wikipedia), который пытается вернуть обратно уменьшеное разрешение цветовой плоскости у низкокачественных jpeg, где оно было уменьшено в два раза (у Save For Web это область quality от 0 до 50 включительно).

updated: Уже два раза спросили, "почему 16x16, а не 8x8". Дело в том, что jpeg делит картинку на яркость и цвет. И цвет сжимается блоками 16x16, а яркость - 8x8.