Реклама на сайте Advertise with us

РНР. Как добавить "шарп" к imagecopyresampled()

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 23/04/10 в 18:13       Ответить с цитатойцитата 

Сделал ресайз и загрузку к себе спонсорских "photo day", т.к. они разных размеров. Было бы неплохо добавить "шарп" к ресайзу, но в РНР не силен (конструкцию из кусков собрал), рыться в справочниках долго.
Спецы РНР, подкиньте код плз в добaвок к этому (эта строка делает ресайз):
Код:
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w_dest, $h_dest, $w_src, $h_src);

0
 

Мотиватор :)

С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607

Ссылка на сообщениеДобавлено: 23/04/10 в 19:04       Ответить с цитатойцитата 

у гд нету встроенного unsharp mask, но его всё же можно реализовать: http://vikjavev.no/computing/ump.php

Just a signature.

6
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 23/04/10 в 22:00       Ответить с цитатойцитата 

alex.raven: Спасибо, то что надо и мужик хорошее наглядное демо сделал для подбора параметров. Только не получается у меня эту функцию вставить. Описал все 4 переменные:

$amount = 300;
$radius = 44;
$threshold = 200;
$img = $dest;

Загвоздка в переменной $img очевидно, выдает пустой прямоугольник. Вот мой код ресайза (аплоад в другом файле):


Код: [развернуть]

После шарпа выводил соотв. imagejpeg($img); но выдает пустую картинку. Как задействовать функцию function UnsharpMask($img, $amount, $radius, $threshold) что по ссылке? - http://vikjavev.no/computing/ump.php

0
 

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
шарпит

крипта на ByBit

0
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 23/04/10 в 22:52       Ответить с цитатойцитата 

Sterx: Ссылки мне не нужны. У меня проблема не в функции, а в том, как ее привинтить. smail101.gif Я для этого и дал рабочий код, чтоб кто может вставил функцию.

0
 

programmer

С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 23/04/10 в 22:59       Ответить с цитатойцитата 

я просто намекаю на то что GD максимум на что годится так это на ресайз. очень жалею в свое время, что не перешел на IM раньше. сорри за оффтоп

крипта на ByBit

0
 



С нами с 07.06.00
Сообщения: 3516
Рейтинг: 1802

Ссылка на сообщениеДобавлено: 24/04/10 в 01:37       Ответить с цитатойцитата 

Зря это вы так про ГД, все оно может, во всяком случае последние версии icon_smile.gif

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() icon_smile.gif Ее почему-то не всегда собирают из сырцов. Если нет -- тоже не беда, вот простой выход:
Код:

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);
        }           
    }
}

ЗЫ: Для пыховых маньяков... Знаю что не оптимально, но работает быстро icon_smile.gif

UPD: Еще из букмарков вспомнил про http://github.com/visionmedia/gd-image-sharpen , тоже достаточно неплохо должно работать и расписано подробно как применять.

Elitist Club и Adult Yellow Pages

4
 

Мотиватор :)

С нами с 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();

?>


результат:

Just a signature.

6
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 24/04/10 в 18:56       Ответить с цитатойцитата 

alex.raven: Спасибо огромное! smail54.gif Взял и вставил, что я и просил, теперь работает. smail69.gif
Благодарю всех за участие!

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 24/04/10 в 20:54       Ответить с цитатойцитата 

photomuza: эта аншарп функция очень сильно грузит процессор. Т.е. использовать для обработки единичных картинок вполне подходит. Для массовой обработки не советую, заткнуть сервер можно очень легко.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

3
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 24/04/10 в 22:10       Ответить с цитатойцитата 

Stek: Спасибо, учту на будущее, в данном случае это 5-6 картинок в день.

0
 

Мотиватор :)

С нами с 06.05.09
Сообщения: 3028
Рейтинг: 607

Ссылка на сообщениеДобавлено: 29/04/10 в 01:00       Ответить с цитатойцитата 

Кстати, здесь я примерно 2 года назад сделал все операции через ImageMagick - в результате создание тумбы + unsharp mask примерно в 5 раз быстрее и процессор не грузит + все тумбы кэшируются на диске. если интересно, поделюсь кодом - мне не жалко smail101.gif

Just a signature.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »