Forum Webscript.Ru
Программирование => PHP => Тема начата: hanslinger от 28 Ноября 2003, 01:29:14
-
Я тут столкнулся с проблемой... мне надо сделать так, чтобы полноцветная картинка превратилась в картинку с определенным диапазоном цветов, заданным в файле "palette.jpg" градиентом.
Скрипт выглядит примерно так:
$img_old=imagecreatefromjpeg($file);
imagetruecolortopalette($img_old,false,65535);
$img_new=imagecreate($nwidth,$nheight);
$img_palette=imagecreatefromjpeg("palette.jpg");
imagetruecolortopalette($img_palette,false,65535);
imagecopyresized($img_new,$img_old,0,0,0,0,$nwidth,$nheight,$owidth,$oheight);
imagepalettecopy($img_new,$img_palette);
imagegammacorrect ($img_new,1,1.23);
imagedestroy($img_old);
imagedestroy($img_palette);
imagejpeg($img_new,basename($file));
imagedestroy($img_new);
Все работает, только жутко теряется качество. Это можно исправить или ничего не поделаешь?
Допускаю мысль, что я извращенец и сделал все через как обычно. Подскажите в таком случае, как можно проще, пожалуйста.
-
hanslinger:
жутко теряется качество
А может так и должно быть? Количество цветов ограничивается - качество теряется.
Это если я тя правильно понял.
-
Ну, я думал, что 65535 цветов достаточно... да я и 16777215 ставил по дурости, все равно эффект один :).
-
imagecreatetruecolor
мануал надо читать
-
Да я понимаю, что надо... да и читал я его... но мне-то надо палитру скопировать! С truecolor\'ными картинками не катит.
-
то есть, тебе надо из шестнадцатимиллионной картинки сделать шестидесятипятитысячную и ты У НАС спрашиваешь, куда подевалось качество?
Делай все фотошопом и не пудри нам мозги.
-
Я, кажется, писал, что ставил 16м.
-
Ты же писал, что с труколорными картинками у тебя "не катит"?
А труколор по-твоему - это сколько?
-
Труколор "по-моему" это 16 миллионов цветов. Но из того же мана, который я все-таки читал, можно, не особо вдаваясь в подробности конструкций картинок, понять, что GD работает с двумя типами картинок, truecolor и palette. Так вот выходит, что, когда у palette 16 миллионов цветов, получается совсем не то же самое, что в truecolor.
Вообще, я не особо хочу тут с тобой ругаться, ты лучше попросту скажи - знаешь, как помочь, или нет?
-
а в функции
imagejpeg ( resource image [, string filename [, int quality]]);
есть параметр дополнительный int quality
может в нем загвоздка?
и вообще GD с JPEG хреново работает ...
-
О, господи. опять нашествие. Опять в нем проснулась страсть поотвечать на вопросы. Опять придется стирать...
Ответ я написал в самом начале.
Человек копирует труколорную картинку в 64к. И потом спрашивает, куда подевалось качество.
От правильного ответа отбрыкивается - мне, говорит, другое надо.
Все ему кругом виноваты.
-
DiJay:
и вообще GD с JPEG хреново работает ...
Это программист с неочень прямыми руками с GD плохо работает...
Вообще сколько можно? не можешь помочь, дать идею, хотя бы намек, ну не лезь. Тысячи программистов используют GD, а у одного не работает. Если ты почитаешь ман нормально, то увидишь:
quality is optional, and ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). Default is to 100
Это означает, что у него не могло попортиться качество из-за того, что он вообще этот параметр не указывает.
-
Ромик! Ты почему-то отчаянно игнорируешь мои посты. Пчитай. Прошу тебя. Мне так обидно, что ты, такой умный и справедливый, сам лажаешься...
-
Yukko: в моем мане написано, что default is to 75. Но я додумался-таки это поменять. Я не тупой. У меня кризис серьезный, не как у большинства.
-
мне нет нужды чтить твои посты.
я прочел твой КОД
Я написал, что в нем надо поменять.
ты отказался.
Ничем больше не могу помочь.
-
RomikChef Хорошо. Если я поменяю 65535 на 16777215, ты сможешь что-нибудь сказать по делу? Ответь, пожалуйста, потому что мне надоели твои придирки не по делу. Если можешь что-нибудь для дела сказать, так скажи. Выпендриваться не обязательно. Я пишу на РНР не первый год, обращаюсь не как лопух, а как человек, которому нужна помощь. А вы, Ромик, совсем неправильно реагируете. Можете меня выгнать с форума, но только скажите, где я не прав.
-
Кста! укажи, где я отказался поменять? Я что-то не найду.
-
Самый мой первый ответ.
я так и неполучил ответа - почему ты не хочешь пользоваться этой функцией.
Без нее у джипега всегда качество будет плохое.
-
hanslinger а на кой тебе это вообче здалось? Хотя я с трудом понимаю со всеми этими переводами. С каждым постом смысл непонятной проблемы меняется куда-то не туда.
-
кстати, еще один косяк нашел.
imagecopyresized надо сменить на resampled.
вообще, у тебя там столько всего навернуто. и поллитры и ресайзы.
Делай постепенно.
сначала создай без изменений.
посмотри качество.
потом добавь ресайз.
посмотри качестов,
если не устраивает - работаешь с ресайзом пока не устроит.
добавляешь поллитру.
а так ты на все с ходу кидаешься, а мы должны, как в что где когда, отгадывать - где у тебя качество теряется.
Если тебе интересно лично мое мнение, то я тебе его скажу.
Библиотека ГД - это не фотошоп.
Лично я с ГД не работаю вообще.
Лично я на скрипты возлагаю только одну задачу - ресайз картинок.
Остальное делаю по-старинке фотошопом.
Может быть, я ретроград. Но я не люблю проблем. А еще больше - проблем, которые придумал себе сам.
-
Раз уже пошел такой разговор то и я выскажу свою точку зрения.
Не знаю есть ли в PHP интерфейс к Imagemagick, но в Perl я такого рода манипуляции делаю только в нем. Это и религия и практика работы с GD.
Решение такого рода задачи у меня заняло бы не более полу часа с Imagemagick.
-
hanslinger
ИМХО, надо смотреть функции:
imagecolorat()
imagecolorsforindex()
imagecolorresolve()
imagecolorclosest()
imagecolorallocate()
Суть такова, что надо сопоставить индексы цветов из одной палитры ближайшим индексам новой палитры, новую палитру ты формируешь из градиента. Надеюсь, разберешься.
Еще мне интересно, как ты хочешь уменьшить количество цветов, но не потерять качество...
hanslinger:чтобы полноцветная картинка превратилась в картинку с определенным диапазоном цветов
hanslinger:Все работает, только жутко теряется качество.
Коэффициент quality, про который уже упомянули, как раз влияет на количество цветов в палитре. Первое, что я бы сделал, вывел бы одну и туже картинку с разным значением этого коэффициента.
-
Это верно. Попробовав его один раз,в сторону ГД уже и не взглянешь
-
Yukko, я вот тоже все про гаммы да поллитры думал.
а ты приглядись внимательнее. у него там копиресайзед стоит.
-
RomikChef
У него есть два способа, либо писать полностью каждый пиксель вручную... либо воспользоваться ответом, который дали вот на этот вопрос:
hanslinger:Подскажите в таком случае, как можно проще, пожалуйста.
Ответ прозвучал:
NeoNox:
Imagemagick
В моем первом предложении этого поста осталось только поменять порядок следования альтернатив:
Сначала идет:
использовать то, что другие используют
потом идет:
заниматься любовью с попиксельным выводом, библиотекой GD и т.д. кому с чем ближе :D :D :D
-
Yukko , повторяю.
Речь идет не об имэджике.
Речь идет о том, что он мог бы причину плохого качества отловить нормальными программистскими методами -отладкой, отбрасыванием лишнего.
И уже конкретно задать вопрос.
не "почему у меня поллитра не того качества", а "какова альтернатива копиресайзеду"
-
RomikChef
согласен, черт возьми :)
-
Вот теперь я услышал, наконец, что-то дельное...
Итак.
Yukko: Я смотрел на все эти функции, читал по нескольку раз все, что написано про них в мане, но пока не придумал, что бы с ними такого интересного сделать. Это мне каждый пиксель придется сопоставлять, а это долго и неприятно. Я попробую еще поковыряться, но как-то безнадежно мне это кажется...
RomikChef:
1) Если пользоваться imagetruecolor(), то КАК, как мне поменять палитру?
2) а) я делал и без изменений, и всяко-разно делал. Портит все и resized, и truecolortopalette(), и palettecopy(). Насчет resampled - надо поглядеть, вдруг и правда подходит больше.
б) Что используешь лично ты, я не спрашивал. Я бы сам с огромным удовольствием использовал Photoshop. Беда в том, что не подходит это для моей задачи.
Про Imagemagick я пока не знаю ничего, но я поищу.
Может быть, будет яснее, если я скажу конкретнее про свою задачу: есть сайт с цветовой гаммой от светло-зеленого до темно-зеленого. Мне нужно, чтобы любая картинка "вписывалась" в эту зеленую гамму. Вот я и мучаюсь. Это не слишком принципиальный вопрос, но я хочу, раз уж делать, то делать все как следует.
-
есть сайт с цветовой гаммой от светло-зеленого до темно-зеленого. Мне нужно, чтобы любая картинка "вписывалась" в эту зеленую гамму. Вот я и мучаюсь. Это не слишком принципиальный вопрос, но я хочу, раз уж делать, то делать все как следует
Yo!!! Нет я просто не выдержал...
скрипт - веб-дизайнер... который сам рисует дизайны...
Долой фотошоп! долой веб-дизайнеров! Интернет, только для программистов и их электронных друзей - скриптов!!!
Ну никак непонятно:
если много картинок - сервак загнется, ну может не загнется, но легче ему не станет, тем более, я очень сильно сомневаюсь, что разработчики GD рассчитывали на такое каскадное изменение изображений...
если мало картинок - то зачем фотошоп? Нет! Мы заставим медведя играть в большой теннис, причем профессионально...
но есть еще вариант - динамическое изменение палитры сайта, да интересно... секунду назад был зеленый, а теперь - синий... причем синее все... смысл? ну может быть смысл есть, не писать каждый раз и не подгонять шаблоны или "шкурки"... но что-то сомнительно практическое применение данного скрипта... Тут не скрипт выдумывать надо, а целый модуль и не пользоваться готовеньким, ну не для того его создавали...
Сразу извиняюсь если вдруг не по теме что-то ляпнул...
-
А в поллитре от темнозеленого до светлозеленого сколько разных цветов умещается? 256 и меньше? И полноцветную картинку в 256 реальных цветов, размазанных по, пусть даже, 16М палитре, перекрашивать. И при этом хотеть качества?
Или приведенный выше код (тот кусок который с палитрами связан) аналогичен по действию труколор->грэйскейл->и_зеленым_затонировать ?
Я вот тут ночь не спал :) , все думал :) . А может тебе количество цветов задавать числом поменьше и посмотреть, что из этого выйдет?
-
Я пробовал. Я задавал вообще 255, результат не сильно отличался от 65к... :)
-
hanslinger, а посмотреть на результаты можно?
-
А с этим история смешная... я три недели ругался с хостером, он только вчера мне выделил новый сервер, я пока там еще не разобрался. Я тогда просто сделаю две картинки и пришлю линк, оке?