Спасибо всем, кто еще МОЖЕТ!
С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570
|
Добавлено: 23/04/10 в 18:13 |
Сделал ресайз и загрузку к себе спонсорских "photo day", т.к. они разных размеров. Было бы неплохо добавить "шарп" к ресайзу, но в РНР не силен (конструкцию из кусков собрал), рыться в справочниках долго.
Спецы РНР, подкиньте код плз в добaвок к этому (эта строка делает ресайз):
Код: | imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src); |
|
|
|
|
Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 23/04/10 в 19:04 |
|
|
|
|
Спасибо всем, кто еще МОЖЕТ!
С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570
|
Добавлено: 23/04/10 в 22:00 |
alex.raven: Спасибо, то что надо и мужик хорошее наглядное демо сделал для подбора параметров. Только не получается у меня эту функцию вставить. Описал все 4 переменные:
$amount = 300;
$radius = 44;
$threshold = 200;
$img = $dest;
Загвоздка в переменной $img очевидно, выдает пустой прямоугольник. Вот мой код ресайза (аплоад в другом файле):
Код: [развернуть] | <?php
// http://www.romver.ru/services/services.php?razdel=1217
// Сложное масштабирование изображений в PHP. Скрипт масштабирования
// f - имя файла
// q - качество сжатия
// src - исходное изображение
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности
// откуда тянем картинку
$f = 'http://fhg.bcash4you.com/ab/fhg-rotator/middle001.jpg';
$q = 100; // качество JPG
$w = 240; // пропорциональная ширина 240
// Здесь как обычно проверяются входные параметры.
// Вы, конечно, можете задать более жёсткие условия проверки. Смотрим дальше.
// создаём исходное изображение на основе
// исходного файла и опеределяем его размеры
$src = imagecreatefromjpeg($f);
$w_src = imagesx($src);
$h_src = imagesy($src);
header("Content-type: image/jpeg");
// В этой части программы мы загружаем исходное изображение в переменную $src.
// Функции imagesx и imagesy определяют размеры исходной картинки и записывают их в соответствующие переменные.
// Они нам понадобятся для вычисления коэффициента пропорциональности.
// Здесь же с помощью функции header передаём заголовок Content-type: image/jpeg в браузер пользователя.
// После этого он ожидает, что следующий поток данных будет jpeg-файлом.
// вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);
// создаём пустую картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w_dest,$h_dest);
// imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
// я заменил на сл. строку (более кач. картинка)
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
/////////////// СЮДА Я ВСТАВИЛ ШАРП /////////////////////
// выводим картинку
imagejpeg($dest);
// и очищаем память
imagedestroy();
?> |
После шарпа выводил соотв. imagejpeg($img); но выдает пустую картинку. Как задействовать функцию function UnsharpMask($img, $amount, $radius, $threshold) что по ссылке? - http://vikjavev.no/computing/ump.php
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760
|
Добавлено: 23/04/10 в 22:07 |
Код: | exec(IM_PATH." -quality 100 -sharpen 0x.4 {$request_thumb} {$request_thumb}"); |
Image Magick
шарпит
|
|
|
|
Спасибо всем, кто еще МОЖЕТ!
С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570
|
Добавлено: 23/04/10 в 22:52 |
Sterx: Ссылки мне не нужны. У меня проблема не в функции, а в том, как ее привинтить. Я для этого и дал рабочий код, чтоб кто может вставил функцию.
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760
|
Добавлено: 23/04/10 в 22:59 |
я просто намекаю на то что GD максимум на что годится так это на ресайз. очень жалею в свое время, что не перешел на IM раньше. сорри за оффтоп
|
|
|
|
С нами с 07.06.00
Сообщения: 3516
Рейтинг: 1802
|
Добавлено: 24/04/10 в 01:37 |
Зря это вы так про ГД, все оно может, во всяком случае последние версии
photomuza писал: | ...
После шарпа выводил соотв. imagejpeg($img); но выдает пустую картинку. Как задействовать функцию function UnsharpMask($img, $amount, $radius, $threshold) что по ссылке? - http://vikjavev.no/computing/ump.php |
у тебя в переменной $img ничего нет (или я не правильно понял на каком этапе ты делаешь $img = $dest;), поэтому и пустая картинка.
Попробуй UnsharpMask($dest, $amount, $radius, $threshold)
Можно еще покрутить с imageconvolution() или imagefilter() ...или посмотреть есть ли в твоей версии ГД imagesharpen() Ее почему-то не всегда собирают из сырцов. Если нет -- тоже не беда, вот простой выход:
Код: |
function imagesharpen($image)
{
$height = imagesy($image);
$width = imagesx($image);
$rs = array(); $gs = array(); $bs = array();
for ($y = 0; $y < $height; ++$y)
{
for ($x = 0; $x < $width; ++$x)
{
$rgb = imagecolorat($image, $x, $y);
$rs[$y][$x] = $rgb >> 0x10;
$gs[$y][$x] = $rgb >> 0x08 & 0xFF;
$bs[$y][$x] = $rgb & 0xFF;
}
}
$height--; $width--;
for ($y = 1; $y < $height; ++$y)
{
$rd = $rs[$y][0];
$gd = $gs[$y][0];
$bd = $bs[$y][0];
$yd = $y - 1;
$yi = $y + 1;
for ($x = 1; $x < $width; ++$x)
{
$r = -($rs[$yd][$x] + $rs[$yi][$x] +
$rd + $rs[$y][$x + 1]) / 4;
$g = -($gs[$yd][$x] + $gs[$yi][$x] +
$gd + $gs[$y][$x + 1]) / 4;
$b = -($bs[$yd][$x] + $bs[$yi][$x] +
$bd + $bs[$y][$x + 1]) / 4;
$r += 2 * $rd = $rs[$y][$x];
$g += 2 * $gd = $gs[$y][$x];
$b += 2 * $bd = $bs[$y][$x];
if ($r < 0) $r = 0;
elseif ($r > 255) $r = 255;
if ($g < 0) $g = 0;
elseif ($g > 255) $g = 255;
if ($b < 0) $b = 0;
elseif ($b > 255) $b = 255;
imagesetpixel($image, $x, $y,
$r << 0x10 | $g << 0x08 | $b);
}
}
}
|
ЗЫ: Для пыховых маньяков... Знаю что не оптимально, но работает быстро
UPD: Еще из букмарков вспомнил про http://github.com/visionmedia/gd-image-sharpen , тоже достаточно неплохо должно работать и расписано подробно как применять.
|
|
|
|
Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 24/04/10 в 04:27 |
Код: |
<?php
function UnsharpMask($img, $amount, $radius, $threshold) {
////////////////////////////////////////////////////////////////////////////////////////////////
////
//// Unsharp Mask for PHP - version 2.1.1
////
//// Unsharp mask algorithm by Torstein Honsi 2003-07.
//// thoensi_at_netcom_dot_no.
//// Please leave this notice.
////
///////////////////////////////////////////////////////////////////////////////////////////////
// $img is an image that is already created within php using
// imgcreatetruecolor. No url! $img must be a truecolor image.
// Attempt to calibrate the parameters to Photoshop:
if ($amount > 500) $amount = 500;
$amount = $amount * 0.016;
if ($radius > 50) $radius = 50;
$radius = $radius * 2;
if ($threshold > 255) $threshold = 255;
$radius = abs(round($radius)); // Only integers make sense.
if ($radius == 0) {
return $img; imagedestroy($img); break; }
$w = imagesx($img); $h = imagesy($img);
$imgCanvas = imagecreatetruecolor($w, $h);
$imgBlur = imagecreatetruecolor($w, $h);
// Gaussian blur matrix:
//
// 1 2 1
// 2 4 2
// 1 2 1
//
//////////////////////////////////////////////////
if (function_exists('imageconvolution')) { // PHP >= 5.1
$matrix = array(
array( 1, 2, 1 ),
array( 2, 4, 2 ),
array( 1, 2, 1 )
);
imagecopy ($imgBlur, $img, 0, 0, 0, 0, $w, $h);
imageconvolution($imgBlur, $matrix, 16, 0);
}
else {
// Move copies of the image around one pixel at the time and merge them with weight
// according to the matrix. The same matrix is simply repeated for higher radii.
for ($i = 0; $i < $radius; $i++) {
imagecopy ($imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left
imagecopymerge ($imgBlur, $img, 1, 0, 0, 0, $w, $h, 50); // right
imagecopymerge ($imgBlur, $img, 0, 0, 0, 0, $w, $h, 50); // center
imagecopy ($imgCanvas, $imgBlur, 0, 0, 0, 0, $w, $h);
imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 33.33333 ); // up
imagecopymerge ($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 25); // down
}
}
if($threshold>0){
// Calculate the difference between the blurred pixels and the original
// and set the pixels
for ($x = 0; $x < $w-1; $x++) { // each row
for ($y = 0; $y < $h; $y++) { // each pixel
$rgbOrig = ImageColorAt($img, $x, $y);
$rOrig = (($rgbOrig >> 16) & 0xFF);
$gOrig = (($rgbOrig >> 8) & 0xFF);
$bOrig = ($rgbOrig & 0xFF);
$rgbBlur = ImageColorAt($imgBlur, $x, $y);
$rBlur = (($rgbBlur >> 16) & 0xFF);
$gBlur = (($rgbBlur >> 8) & 0xFF);
$bBlur = ($rgbBlur & 0xFF);
// When the masked pixels differ less from the original
// than the threshold specifies, they are set to their original value.
$rNew = (abs($rOrig - $rBlur) >= $threshold)
? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig))
: $rOrig;
$gNew = (abs($gOrig - $gBlur) >= $threshold)
? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig))
: $gOrig;
$bNew = (abs($bOrig - $bBlur) >= $threshold)
? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig))
: $bOrig;
if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) {
$pixCol = ImageColorAllocate($img, $rNew, $gNew, $bNew);
ImageSetPixel($img, $x, $y, $pixCol);
}
}
}
}
else{
for ($x = 0; $x < $w; $x++) { // each row
for ($y = 0; $y < $h; $y++) { // each pixel
$rgbOrig = ImageColorAt($img, $x, $y);
$rOrig = (($rgbOrig >> 16) & 0xFF);
$gOrig = (($rgbOrig >> 8) & 0xFF);
$bOrig = ($rgbOrig & 0xFF);
$rgbBlur = ImageColorAt($imgBlur, $x, $y);
$rBlur = (($rgbBlur >> 16) & 0xFF);
$gBlur = (($rgbBlur >> 8) & 0xFF);
$bBlur = ($rgbBlur & 0xFF);
$rNew = ($amount * ($rOrig - $rBlur)) + $rOrig;
if($rNew>255){$rNew=255;}
elseif($rNew<0){$rNew=0;}
$gNew = ($amount * ($gOrig - $gBlur)) + $gOrig;
if($gNew>255){$gNew=255;}
elseif($gNew<0){$gNew=0;}
$bNew = ($amount * ($bOrig - $bBlur)) + $bOrig;
if($bNew>255){$bNew=255;}
elseif($bNew<0){$bNew=0;}
$rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew;
ImageSetPixel($img, $x, $y, $rgbNew);
}
}
}
imagedestroy($imgCanvas);
imagedestroy($imgBlur);
return $img;
}
// http://www.romver.ru/services/services.php?razdel=1217
// Сложное масштабирование изображений в PHP. Скрипт масштабирования
// f - имя файла
// q - качество сжатия
// src - исходное изображение
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности
// откуда тянем картинку
$f = 'http://fhg.bcash4you.com/ab/fhg-rotator/middle001.jpg';
$q = 100; // качество JPG
$w = 240; // пропорциональная ширина 240
// Здесь как обычно проверяются входные параметры.
// Вы, конечно, можете задать более жёсткие условия проверки. Смотрим дальше.
// создаём исходное изображение на основе
// исходного файла и опеределяем его размеры
$src = imagecreatefromjpeg($f);
$w_src = imagesx($src);
$h_src = imagesy($src);
header("Content-type: image/jpeg");
// В этой части программы мы загружаем исходное изображение в переменную $src.
// Функции imagesx и imagesy определяют размеры исходной картинки и записывают их в соответствующие переменные.
// Они нам понадобятся для вычисления коэффициента пропорциональности.
// Здесь же с помощью функции header передаём заголовок Content-type: image/jpeg в браузер пользователя.
// После этого он ожидает, что следующий поток данных будет jpeg-файлом.
// вычисление пропорций
$ratio = $w_src/$w;
$w_dest = round($w_src/$ratio);
$h_dest = round($h_src/$ratio);
// создаём пустую картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w_dest,$h_dest);
// imagecopyresized($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
// я заменил на сл. строку (более кач. картинка)
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);
/////////////// СЮДА Я ВСТАВИЛ ШАРП /////////////////////
unsharpMask($dest, 80, 0.5, 3); // <--- здесь
// выводим картинку
imagejpeg($dest);
// и очищаем память
imagedestroy();
?>
|
результат:
|
|
|
|
Спасибо всем, кто еще МОЖЕТ!
С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570
|
Добавлено: 24/04/10 в 18:56 |
alex.raven: Спасибо огромное! Взял и вставил, что я и просил, теперь работает.
Благодарю всех за участие!
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 24/04/10 в 20:54 |
photomuza: эта аншарп функция очень сильно грузит процессор. Т.е. использовать для обработки единичных картинок вполне подходит. Для массовой обработки не советую, заткнуть сервер можно очень легко.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
3
|
|
|
Спасибо всем, кто еще МОЖЕТ!
С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570
|
Добавлено: 24/04/10 в 22:10 |
Stek: Спасибо, учту на будущее, в данном случае это 5-6 картинок в день.
|
|
|
|
Мотиватор :)
С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607
|
Добавлено: 29/04/10 в 01:00 |
Кстати, здесь я примерно 2 года назад сделал все операции через ImageMagick - в результате создание тумбы + unsharp mask примерно в 5 раз быстрее и процессор не грузит + все тумбы кэшируются на диске. если интересно, поделюсь кодом - мне не жалко
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |
|
Спонсор раздела
|