КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

IMagick на примерах

try{
  /* Чтение изображения */
  $im = new Imagick(__DIR__."/examples.jpg");
  /* Миниатюра изображения */
  $im->thumbnailImage(500, null);
  /* Создание рамки для изображения */
  $im->borderImage(new ImagickPixel("green"), 5, 5);
  /* Клонируем изображение и зеркально поворачиваем его */
  $reflection = clone($im);
  $reflection->flipImage();
  /* Создаём градиент. Это будет наложением для отражения */
  $gradient = new Imagick();
  /* Градиент должен быть достаточно большой
   для изображения и его рамки */
  $gradient->newPseudoImage($reflection->getImageWidth() + 10, 
  $reflection->getImageHeight() + 10, "gradient:transparent-black");
  /* Наложение градиента на отражение */
  $reflection->compositeImage($gradient,
   imagick::COMPOSITE_OVER, 0, 0);
  /* Добавляем прозрачность. 
  Требуется ImageMagick 6.2.9 или выше */
  $reflection->setImageOpacity( 0.5 );
  /* Создаём пустой холст */
  $canvas = new Imagick();
  /* Холст должен быть достаточно большой, 
  чтобы вместить оба изображения */
  $width = $im->getImageWidth() + 30;
  $height = ($im->getImageHeight() * 2) + 40;
  $canvas->newImage($width, $height, new ImagickPixel("black"));
  $canvas->setImageFormat("png");
  // Наложение оригинального изображения и отражения на холст
  $canvas->compositeImage($im, imagick::COMPOSITE_OVER, 15, 20);
  $canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 
  15, $im->getImageHeight() + 20);
}
catch(Exception $e){
  echo 'У нас проблема '. $e->getMessage(). 
  " в файле ".$e->getFile().", строка ".$e->getLine();
}
/* Вывод изображения */
header("Content-Type: image/png");
echo $canvas;
$canvas->writeImage(__DIR__.'/reflexion.png');

Всем привет! Видали, что она может? А теперь давайте соберёмся с силами и напишем две функции, которые в процессе загрузки файла на сервер изменят его размер и наложат "водяной знак" (другую картинку, если нужно). Причём неважно, будет ли это jpg, lpeg, png или gif-ка. Итак, поехали::

Функция ресайзу:

function resizeUploadImg($orig, $path, $width = 400, $height = 300){
  $result=FALSE;
  try {
    $img = new Imagick($orig);
    if($img->getImageMimeType()=='image/gif'){
      
    foreach ($img as $frame) {
      $frame->thumbnailImage($width, 0);        
    }
      // Обратите внимание, writeImages вместо writeImage
      $result=$img->writeImages($path, true);
    
    }else{
      $img->thumbnailImage($width, 0);
      $img->setImageCompression(Imagick::COMPRESSION_JPEG);
      $img->setImageCompressionQuality(70);
      $result = $img->writeImage($path);
    }
      $img->clear();
  }catch(ImagickException $e){
    echo 'У нас проблема '. $e->getMessage(). " в файле ".$e->getFile().", строка ".$e->getLine();
  }
  return $result;
}

Для наложения водяного знака:

function add_watermark( $source_image_path, $watermark_path, $output, $width){
  
  $result = false;

  try{
      
    $first = new \Imagick($source_image_path); 
    $second = new \Imagick($watermark_path);

    if($first->getImageMimeType()=='image/gif'){
          
      if($second->getImageMimeType()=='image/gif'){
          
        foreach($second as $frame){
          $frame->thumbnailImage($width/7, 0);
          $frame->setImageOpacity( 0.8);
        }
        
        $tmppath = __DIR__ . '/tmp/' . uniqid() . microtime(true).'.gif';
        $second->writeImages($tmppath, true);
        
        $second = new \Imagick($tmppath);
        foreach($second as $key=>$frame){
          $frame->writeImage(__DIR__. '/tmp2/' .$key.'.jpg');
        }
        
        $scan = glob('tmp2/*');
        sort($scan, SORT_NATURAL);
        
        foreach($first as $key=>$frame){
          $frame->thumbnailImage($width, 0);
          
          $width_src = $frame->getImageWidth(); // узнаем ширину
          $height_src = $frame->getImageHeight(); // и высоту
          $width_mark = $second->getImageWidth(); 
          $height_mark = $second->getImageHeight(); 
          $x = $width_src - $width_mark-7;
          $y = $height_src - $height_mark-7;
          if(array_key_exists($key, $scan)){
            $new = new \Imagick(realpath($scan[$key]));
          }                
            
          //накладываем изображения
          $frame->compositeImage($new, imagick::COMPOSITE_DEFAULT, $x, $y);   
          
        }
        
        $result = $first->writeImages($output, true);
        unlink($tmppath);
        deleteAllFiles('tmp2');
          
      }else{
           
        // изменим размер "водяого" исходя из переданной ширины
        $second->thumbnailImage($width/7, 0);
        $second->setImageOpacity( 0.8);

        // то для каждого фрейма гифки делаем следующее:
        foreach ($first as $frame) {
          $frame->thumbnailImage($width, 0);
          $width_src = $first->getImageWidth();// узнаем ширину
          $height_src = $first->getImageHeight();// и высоту
          $width_mark = $second->getImageWidth(); 
          $height_mark = $second->getImageHeight(); 
          $x = $width_src - $width_mark-7;
          $y = $height_src - $height_mark-7;
          //накладываем изображения
          $frame->compositeImage($second, imagick::COMPOSITE_DEFAULT, $x, $y);
        }
        
        $result=$first->writeImages($output, true);
      }
    }else{
          
      $first->thumbnailImage($width, 0);
          
      if($second->getImageMimeType()=='image/gif'){
          
        $new = new \Imagick();
        
        $delay = getDelay($watermark_path)[0];
        
        foreach($second as $frame){
          $frame->thumbnailImage($width/7, 0);
        }
        $tmppath = __DIR__ . '/tmp/' . uniqid() . microtime(true).'.gif';
        $second->writeImages($tmppath, true);
        
        $second = new \Imagick($tmppath);
        $width_src = $first->getImageWidth(); 
        $height_src = $first->getImageHeight();
        $width_mark = $second->getImageWidth();
        $height_mark = $second->getImageHeight();
        $x = $width_src - $width_mark-7;
        $y = $height_src - $height_mark-7;
        
        foreach($second as $frame){

          $frame->setImageOpacity( 0.8);
          $firt = clone $first;
          
          //накладываем изображения
          $firt->compositeImage($frame, imagick::COMPOSITE_DEFAULT, $x, $y);   
          $firt->setImageDelay($delay);
          $new->addImage($firt);
        }
        $result = $new->writeImages($output, true);
        unlink($tmppath);
      }else{
        $first->thumbnailImage($width, 0);
            $second->thumbnailImage($width/7, 0);
        $width_src = $first->getImageWidth(); 
        $height_src = $first->getImageHeight();
        $width_mark = $second->getImageWidth();
        $height_mark = $second->getImageHeight();
        $x = $width_src - $width_mark-7;
        $y = $height_src - $height_mark-7;
        $first->compositeImage($second, imagick::COMPOSITE_DEFAULT, $x, $y);   
        //устанавливаем степень сжатия
        $first->setImageCompression(Imagick::COMPRESSION_JPEG);
        //и качество 
        $first->setImageCompressionQuality(90);
        $result = $first->writeImage($output);    
      }
    
    }

    $first->clear();
    $second->clear();

  }catch(Exception $e){
      echo 'У нас проблема '. $e->getMessage(). " в файле ".$e->getFile().", строка ".$e->getLine();
  }
  
  return $result;
}

Пробуем, смотрим результат

2015.07.22 123
jpgjpg

http://php.net/manual/ru/book.imagick.php
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика