Цветовой сдвиг при создании превьюшек

untied

Сдвинутый новичок
Цветовой сдвиг при создании превьюшек

Давно замечал такой баг в PHP::GD :
Когда делаешь масштабирование картинки с помощью ф-ии imagecopyresized() (например, картинка загружена из файла и надо сделать ее "превьюшку"), то часто происходит цветовой сдвиг в получаемом изображении.
Иногда оно темнеет, иногда синеет, иногда зеленеет и т.п.

К примеру:

http://www.offroad.ru/gallery/gal_piclist.php?action=list&g_id=12&colnumb=5&rownumb=10&pagnumb=2

Видно, что многие превьюшки посинели.

А на предыдущей странице все более-менее:

http://www.offroad.ru/gallery/gal_piclist.php?action=list&g_id=12&colnumb=5&rownumb=10&pagnumb=1

Из-за чего происходит цветовой сдвиг, и как с ним бороться? Вывод превьюшки функцией imagejpeg() с качеством 100 не помогает (можно даже сделать imagepng(), где потери качества вообще нет, и картинки все равно будут синими).
 

untied

Сдвинутый новичок
!!! ВАХ !!!

Помогло! :)
Спасибо за информацию!
Только теперь дольше масштабирование происходит, но это мелочи жизни. В след раз буду превьюшки хранить в БД. :D
 

untied

Сдвинутый новичок
Есть один резон!

Клиент заказал модуль управления фотогалереей, с бек-офисом, редактированием разделов, групп, фоток, подписей, комментариев.
Соответственно все это хозяйство я храню в БД MySQL. И управление информацией (в т.ч. и фотографиями) происходит только через интерфейс администратора. Допустим, если человек удаляет фотографию, то он совершает некое осмысленное действие (и его еще десять раз спросят, уверен ли он в своих поступках).
А если файлы с фотками будут храниться просто в файловой системе (т.е. доступ к ним будет не только через интерфейс админа), то есть вероятность, что какой-нибудь пенёк веб-мастер что-либо по ошибке потрет. И потом среди ночи мне неожиданно позвонит админ сайта и срывающимся голосом будет спрашивать, куда делись некоторые фотографии: подписи к ним вроде бы есть, а самих картинок нет... и т.д. и т.п. и, наконец, ЧТО ДЕЛАТЬ???

Зачем мне это? :D

Ну то есть тут вопрос целостности информации и централизованности управления ею. Фотку можно удалить только централизованно и осмысленно. И вместе с фоткой обязательно удалятся ее id, описание, подпись и т.п.
 

SiMM

Новичок
Автор оригинала: untied
А если файлы с фотками будут храниться просто в файловой системе (т.е. доступ к ним будет не только через интерфейс админа), то есть вероятность, что какой-нибудь пенёк веб-мастер что-либо по ошибке потрет.
А по твоему пенёк вэб-мастер не может что-нибудь потереть по ошибке в базе? Т.е. фиг с ней, бОльшей нагрузкой на сервак - лишь бы в вэбмастеры пеньков брали? Ну хорошо, ок, потреял превьюшку - а перегенерить её по новой - такая большая проблема?
 

untied

Сдвинутый новичок
Ну, как известно, все имеет предел... Только человеческая глупость беспредельна. ;)

Конечно, какой-нибудь дурак может зайти в phpMyAdmin, найти нужную таблицу и вызвать команду DROP TABLE. Но опять же это будут осмысленные действия человека, который знает команды SQL или хотя бы понимает, какая информация выводится ему на страницах phpMyAdmin.
И если какой-нибудь пенёк веб-мастер сотворит такое, я со спокойной совестью буду показывать на него ногтями и говорить: "Это все он!!! Это его рук дело!!! Запускайте процедуру переустановки модуля и по-новой вводите все группы и фотографии!"
Да и потом, в phpMyAdmin неразбирающиеся люди залезают довольно редко. А вот удаляют файлы и перемещают папки довольно часто.

Ну а насчет нагрузки на MySQL...
MySQL -- это база данных, и она должна работать! Нефиг ее жалеть, если мне удобнее данные хранить в ней, а не в файлах. :p (это было моё ИМХО)
 

Frol

Новичок
untied
не неси чушь.

оправдания малого ребенка, когда тот разбил вазу.
 

Фанат

oncle terrible
Команда форума
я думаю, такие темы надо закрывать
что он тупит - человеку ясно сказали.
что он положил на это - он тоже ясно сказал.
лечить насильно - дело неблагодарное.
тем более, что при нагрузке в полтора человека у нег овсе ьудет работать.
а при большей - сам прибежит рыдать в три ручья, сопли размазывая.
а пока тема исчерпана.
 

untied

Сдвинутый новичок
Как говорит одна восточная мудрость, когда ты говоришь, уши твои должны слышать, что ты говоришь... :rolleyes:

Frol, о чем ты, дорогой? Я ни в чем не оправдываюсь, это уже твои проекции, уважаемый...
У меня-то все программы замечательно работают, данные не пропадают неожиданным образом, сервера не зависают от переутомления и, главное, сплю я как младенец, спокойными и счастливыми снами. :D
Вот разве что превьюшки синели, но с помощью совета SiMM-а уже не синеют.
Красота!:D
 

SiMM

Новичок
Автор оригинала: untied
MySQL -- это база данных, и она должна работать!
Да, должна. По назначению. А не быть помойкой с кучей бесполезного хлама (это похоже на попытку запихнуть в маленький походный рюкзачёк кондиционер, шифанер с вечерним бельём - вещи в походе вобщем-то абослютно бесполезные).
PS: надеюсь, рассказывать про полнотекстовый поиск в превьюшках ты не будешь.
 

untied

Сдвинутый новичок
Ну, в принципе, есть некая здравая мысля в хранении файлов данных отдельно от базы! Видимо, надо будет хранить их в специальном каталоге, созданном самим скриптом, с правами 0700 (чтобы веб-мастера не добрались).
Попробую в след. проекте.

Обидно, что построение превьюшек на лету стало медленным! Сохранение готовых превьюшек решает проблему скорости, но зато тогда оперативно не поменяешь их размер, переписав пару строк:

define("INT_THUMBNAIL_WIDTH","150");
define("INT_THUMBNAIL_HEIGHT","150");

За все приходится платить. :D
 

SiMM

Новичок
Автор оригинала: untied
Обидно, что построение превьюшек на лету стало медленным! Сохранение готовых превьюшек решает проблему скорости, но зато тогда оперативно не поменяешь их размер, переписав пару строк:

define("INT_THUMBNAIL_WIDTH","150");
define("INT_THUMBNAIL_HEIGHT","150");

За все приходится платить. :D
Просто ты не умеешь их готовить ;)
Давай рассмотрим возможные пути решения твоей проблемы:
а) использовать свойства width и height тэга img
б) переконвертировать все картинки при изменении размеров
в) формировать картинки на лету, при чём, если картинка уже есть в кэше и её размер соответствует необходимому - просто выдать картинку из кэша, иначе создать картинку нужного размера
 
Сверху