国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php使用imagick模塊實(shí)現(xiàn)圖片縮放、裁剪、壓縮示例

php使用imagick模塊實(shí)現(xiàn)圖片縮放、裁剪、壓縮示例

2020-06-23 13:35PHP教程網(wǎng) PHP教程

這篇文章主要介紹了php使用imagick模塊實(shí)現(xiàn)圖片縮放、裁剪、壓縮示例,需要的朋友可以參考下

PHP 使用Imagick模塊 縮放,裁剪,壓縮圖片 包括gif圖片

縮放 裁剪

 

復(fù)制代碼 代碼如下:

/**
  * 圖片裁剪
  * 裁剪規(guī)則:
  *   1. 高度為空或?yàn)榱?nbsp;  按寬度縮放 高度自適應(yīng)
  *   2. 寬度為空或?yàn)榱?nbsp; 按高度縮放 寬度自適應(yīng)
  *      3. 寬度,高度到不為空或?yàn)榱?nbsp; 按寬高比例等比例縮放裁剪  默認(rèn)從頭部居中裁剪
  * @param number $width
  * @param number $height
  */
 public function resize($width=0, $height=0){
  if($width==0 && $height==0){
   return;
  }

  $color = '';// 'rgba(255,255,255,1)';
  $size = $this->image->getImagePage ();
  //原始寬高
  $src_width = $size ['width'];
  $src_height = $size ['height'];

  //按寬度縮放 高度自適應(yīng)
  if($width!=0 && $height==0){
   if($src_width>$width){
    $height = intval($width*$src_height/$src_width);

    if ($this->type == 'gif') {
     $this->_resizeGif($width, $height);
    }else{
     $this->image->thumbnailImage ( $width, $height, true );
    }
   }
   return;
  }
  //按高度縮放 寬度自適應(yīng)
  if($width==0 && $height!=0){
   if($src_height>$height){
    $width = intval($src_width*$height/$src_height);

    if ($this->type == 'gif') {
     $this->_resizeGif($width, $height);
    }else{
     $this->image->thumbnailImage ( $width, $height, true );
    }
   }
   return;
  }

  //縮放的后的尺寸
  $crop_w = $width;
  $crop_h = $height;

  //縮放后裁剪的位置
  $crop_x = 0;
  $crop_y = 0;

  if(($src_width/$src_height) < ($width/$height)){
   //寬高比例小于目標(biāo)寬高比例  寬度等比例放大      按目標(biāo)高度從頭部截取
   $crop_h = intval($src_height*$width/$src_width);
   //從頂部裁剪  不用計(jì)算 $crop_y
  }else{
   //寬高比例大于目標(biāo)寬高比例   高度等比例放大      按目標(biāo)寬度居中裁剪
   $crop_w = intval($src_width*$height/$src_height);
   $crop_x = intval(($crop_w-$width)/2);
  }

  if ($this->type == 'gif') {
   $this->_resizeGif($crop_w, $crop_h, true, $width, $height,$crop_x, $crop_y);
  } else {
   $this->image->thumbnailImage ( $crop_w, $crop_h, true );
   $this->image->cropImage($width, $height,$crop_x, $crop_y);
  }
 }

 

針對gif圖片的處理方法

 

復(fù)制代碼 代碼如下:

/**
  * 處理gif圖片 需要對每一幀圖片處理
  * @param unknown $t_w  縮放寬
  * @param unknown $t_h  縮放高
  * @param string $isCrop  是否裁剪
  * @param number $c_w  裁剪寬
  * @param number $c_h  裁剪高
  * @param number $c_x  裁剪坐標(biāo) x
  * @param number $c_y  裁剪坐標(biāo) y
  */
 private function _resizeGif($t_w, $t_h, $isCrop=false, $c_w=0, $c_h=0, $c_x=0, $c_y=0){
  $dest = new Imagick();
  $color_transparent = new ImagickPixel("transparent"); //透明色
  foreach($this->image as $img){
   $page = $img->getImagePage();
   $tmp = new Imagick();
   $tmp->newImage($page['width'], $page['height'], $color_transparent, 'gif');
   $tmp->compositeImage($img, Imagick::COMPOSITE_OVER, $page['x'], $page['y']);

   $tmp->thumbnailImage ( $t_w, $t_h, true );
   if($isCrop){
    $tmp->cropImage($c_w, $c_h, $c_x, $c_y);
   }

   $dest->addImage($tmp);
   $dest->setImagePage($tmp->getImageWidth(), $tmp->getImageHeight(), 0, 0);
   $dest->setImageDelay($img->getImageDelay());
   $dest->setImageDispose($img->getImageDispose());

  }
  $this->image->destroy ();
  $this->image = $dest;
 }

 

保存時(shí)壓縮處理

 

復(fù)制代碼 代碼如下:

// 保存到指定路徑
 public function save_to($path) {
  //壓縮圖片質(zhì)量
  $this->image->setImageFormat('JPEG');
  $this->image->setImageCompression(Imagick::COMPRESSION_JPEG);
  $a = $this->image->getImageCompressionQuality() * 0.60;
  if ($a == 0) {
   $a = 60;
  }
  $this->image->setImageCompressionQuality($a);
  $this->image->stripImage();

  if ($this->type == 'gif') {
   $this->image->writeImages ( $path, true );
  } else {
   $this->image->writeImage ( $path );
  }
 }

 

ImagickService.php

 

復(fù)制代碼 代碼如下:


<?php

 

/**
 * 圖片處理服務(wù)類
 * 使用php擴(kuò)展服務(wù)Imagick實(shí)現(xiàn)
 * ImageMagick 官網(wǎng)地址 [url]http:www.imagemagick.org/script/index.php[/url] 
 *
 * @author weiguang3
 * @since 20140403
 */
class ImagickService {
 private $image = null;
 private $type = null;

 // 構(gòu)造函數(shù)
 public function __construct() {
 }

 // 析構(gòu)函數(shù)
 public function __destruct() {
  if ($this->image !== null)
   $this->image->destroy ();
 }

 public function init(){

 }

 // 載入圖像
 public function open($path) {
  $this->image = new Imagick ( $path );
  if ($this->image) {
   $this->type = strtolower ( $this->image->getImageFormat () );
  }
  return $this->image;
 }

 /**
  * 圖片裁剪
  * 裁剪規(guī)則:
  *   1. 高度為空或?yàn)榱?nbsp;  按寬度縮放 高度自適應(yīng)
  *   2. 寬度為空或?yàn)榱?nbsp; 按高度縮放 寬度自適應(yīng)
  *      3. 寬度,高度到不為空或?yàn)榱?nbsp; 按寬高比例等比例縮放裁剪  默認(rèn)從頭部居中裁剪
  * @param number $width
  * @param number $height
  */
 public function resize($width=0, $height=0){
  if($width==0 && $height==0){
   return;
  }

  $color = '';// 'rgba(255,255,255,1)';
  $size = $this->image->getImagePage ();
  //原始寬高
  $src_width = $size ['width'];
  $src_height = $size ['height'];

  //按寬度縮放 高度自適應(yīng)
  if($width!=0 && $height==0){
   if($src_width>$width){
    $height = intval($width*$src_height/$src_width);

    if ($this->type == 'gif') {
     $this->_resizeGif($width, $height);
    }else{
     $this->image->thumbnailImage ( $width, $height, true );
    }
   }
   return;
  }
  //按高度縮放 寬度自適應(yīng)
  if($width==0 && $height!=0){
   if($src_height>$height){
    $width = intval($src_width*$height/$src_height);

    if ($this->type == 'gif') {
     $this->_resizeGif($width, $height);
    }else{
     $this->image->thumbnailImage ( $width, $height, true );
    }
   }
   return;
  }

  //縮放的后的尺寸
  $crop_w = $width;
  $crop_h = $height;

  //縮放后裁剪的位置
  $crop_x = 0;
  $crop_y = 0;

  if(($src_width/$src_height) < ($width/$height)){
   //寬高比例小于目標(biāo)寬高比例  寬度等比例放大      按目標(biāo)高度從頭部截取
   $crop_h = intval($src_height*$width/$src_width);
   //從頂部裁剪  不用計(jì)算 $crop_y
  }else{
   //寬高比例大于目標(biāo)寬高比例   高度等比例放大      按目標(biāo)寬度居中裁剪
   $crop_w = intval($src_width*$height/$src_height);
   $crop_x = intval(($crop_w-$width)/2);
  }

  if ($this->type == 'gif') {
   $this->_resizeGif($crop_w, $crop_h, true, $width, $height,$crop_x, $crop_y);
  } else {
   $this->image->thumbnailImage ( $crop_w, $crop_h, true );
   $this->image->cropImage($width, $height,$crop_x, $crop_y);
  }
 }

 /**
  * 處理gif圖片 需要對每一幀圖片處理
  * @param unknown $t_w  縮放寬
  * @param unknown $t_h  縮放高
  * @param string $isCrop  是否裁剪
  * @param number $c_w  裁剪寬
  * @param number $c_h  裁剪高
  * @param number $c_x  裁剪坐標(biāo) x
  * @param number $c_y  裁剪坐標(biāo) y
  */
 private function _resizeGif($t_w, $t_h, $isCrop=false, $c_w=0, $c_h=0, $c_x=0, $c_y=0){
  $dest = new Imagick();
  $color_transparent = new ImagickPixel("transparent"); //透明色
  foreach($this->image as $img){
   $page = $img->getImagePage();
   $tmp = new Imagick();
   $tmp->newImage($page['width'], $page['height'], $color_transparent, 'gif');
   $tmp->compositeImage($img, Imagick::COMPOSITE_OVER, $page['x'], $page['y']);

   $tmp->thumbnailImage ( $t_w, $t_h, true );
   if($isCrop){
    $tmp->cropImage($c_w, $c_h, $c_x, $c_y);
   }

   $dest->addImage($tmp);
   $dest->setImagePage($tmp->getImageWidth(), $tmp->getImageHeight(), 0, 0);
   $dest->setImageDelay($img->getImageDelay());
   $dest->setImageDispose($img->getImageDispose());

  }
  $this->image->destroy ();
  $this->image = $dest;
 }

 
 /**
  * 更改圖像大小
  *  $fit: 適應(yīng)大小方式
  *   'force': 把圖片強(qiáng)制變形成 $width X $height 大小
  *   'scale': 按比例在安全框 $width X $height 內(nèi)縮放圖片, 輸出縮放后圖像大小 不完全等于 $width X $height
  *   'scale_fill': 按比例在安全框 $width X $height 內(nèi)縮放圖片,安全框內(nèi)沒有像素的地方填充色,
  *    使用此參數(shù)時(shí)可設(shè)置背景填充色 $bg_color = array(255,255,255)(紅,綠,藍(lán), 透明度)
  *    透明度(0不透明-127完全透明)) 其它: 智能模能 縮放圖像并載取圖像的中間部分 $width X $height 像素大小
  *  $fit = 'force','scale','scale_fill' 時(shí): 輸出完整圖像
  *  $fit = 圖像方位值 時(shí), 輸出指定位置部分圖像 字母與圖像的對應(yīng)關(guān)系如下:
  *   north_west north north_east
  *   west center east
  *   south_west south south_east
  */
 public function resize_to($width = 100, $height = 100, $fit = 'center', $fill_color = array(255,255,255,0)) {
  switch ($fit) {
   case 'force' :
    if ($this->type == 'gif') {
     $image = $this->image;
     $canvas = new Imagick ();

     $images = $image->coalesceImages ();
     foreach ( $images as $frame ) {
      $img = new Imagick ();
      $img->readImageBlob ( $frame );
      $img->thumbnailImage ( $width, $height, false );

      $canvas->addImage ( $img );
      $canvas->setImageDelay ( $img->getImageDelay () );
     }
     $image->destroy ();
     $this->image = $canvas;
    } else {
     $this->image->thumbnailImage ( $width, $height, false );
    }
    break;
   case 'scale' :
    if ($this->type == 'gif') {
     $image = $this->image;
     $images = $image->coalesceImages ();
     $canvas = new Imagick ();
     foreach ( $images as $frame ) {
      $img = new Imagick ();
      $img->readImageBlob ( $frame );
      $img->thumbnailImage ( $width, $height, true );

      $canvas->addImage ( $img );
      $canvas->setImageDelay ( $img->getImageDelay () );
     }
     $image->destroy ();
     $this->image = $canvas;
    } else {
     $this->image->thumbnailImage ( $width, $height, true );
    }
    break;
   case 'scale_fill' :
    $size = $this->image->getImagePage ();
    $src_width = $size ['width'];
    $src_height = $size ['height'];

    $x = 0;
    $y = 0;

    $dst_width = $width;
    $dst_height = $height;

    if ($src_width * $height > $src_height * $width) {
     $dst_height = intval ( $width * $src_height / $src_width );
     $y = intval ( ($height - $dst_height) / 2 );
    } else {
     $dst_width = intval ( $height * $src_width / $src_height );
     $x = intval ( ($width - $dst_width) / 2 );
    }

    $image = $this->image;
    $canvas = new Imagick ();

    $color = 'rgba(' . $fill_color [0] . ',' . $fill_color [1] . ',' . $fill_color [2] . ',' . $fill_color [3] . ')';
    if ($this->type == 'gif') {
     $images = $image->coalesceImages ();
     foreach ( $images as $frame ) {
      $frame->thumbnailImage ( $width, $height, true );

      $draw = new ImagickDraw ();
      $draw->composite ( $frame->getImageCompose (), $x, $y, $dst_width, $dst_height, $frame );

      $img = new Imagick ();
      $img->newImage ( $width, $height, $color, 'gif' );
      $img->drawImage ( $draw );

      $canvas->addImage ( $img );
      $canvas->setImageDelay ( $img->getImageDelay () );
      $canvas->setImagePage ( $width, $height, 0, 0 );
     }
    } else {
     $image->thumbnailImage ( $width, $height, true );

     $draw = new ImagickDraw ();
     $draw->composite ( $image->getImageCompose (), $x, $y, $dst_width, $dst_height, $image );

     $canvas->newImage ( $width, $height, $color, $this->get_type () );
     $canvas->drawImage ( $draw );
     $canvas->setImagePage ( $width, $height, 0, 0 );
    }
    $image->destroy ();
    $this->image = $canvas;
    break;
   default :
    $size = $this->image->getImagePage ();
    $src_width = $size ['width'];
    $src_height = $size ['height'];

    $crop_x = 0;
    $crop_y = 0;

    $crop_w = $src_width;
    $crop_h = $src_height;

    if ($src_width * $height > $src_height * $width) {
     $crop_w = intval ( $src_height * $width / $height );
    } else {
     $crop_h = intval ( $src_width * $height / $width );
    }

    switch ($fit) {
     case 'north_west' :
      $crop_x = 0;
      $crop_y = 0;
      break;
     case 'north' :
      $crop_x = intval ( ($src_width - $crop_w) / 2 );
      $crop_y = 0;
      break;
     case 'north_east' :
      $crop_x = $src_width - $crop_w;
      $crop_y = 0;
      break;
     case 'west' :
      $crop_x = 0;
      $crop_y = intval ( ($src_height - $crop_h) / 2 );
      break;
     case 'center' :
      $crop_x = intval ( ($src_width - $crop_w) / 2 );
      $crop_y = intval ( ($src_height - $crop_h) / 2 );
      break;
     case 'east' :
      $crop_x = $src_width - $crop_w;
      $crop_y = intval ( ($src_height - $crop_h) / 2 );
      break;
     case 'south_west' :
      $crop_x = 0;
      $crop_y = $src_height - $crop_h;
      break;
     case 'south' :
      $crop_x = intval ( ($src_width - $crop_w) / 2 );
      $crop_y = $src_height - $crop_h;
      break;
     case 'south_east' :
      $crop_x = $src_width - $crop_w;
      $crop_y = $src_height - $crop_h;
      break;
     default :
      $crop_x = intval ( ($src_width - $crop_w) / 2 );
      $crop_y = intval ( ($src_height - $crop_h) / 2 );
    }

    $image = $this->image;
    $canvas = new Imagick ();

    if ($this->type == 'gif') {
     $images = $image->coalesceImages ();
     foreach ( $images as $frame ) {
      $img = new Imagick ();
      $img->readImageBlob ( $frame );
      $img->cropImage ( $crop_w, $crop_h, $crop_x, $crop_y );
      $img->thumbnailImage ( $width, $height, true );

      $canvas->addImage ( $img );
      $canvas->setImageDelay ( $img->getImageDelay () );
      $canvas->setImagePage ( $width, $height, 0, 0 );
     }
    } else {
     $image->cropImage ( $crop_w, $crop_h, $crop_x, $crop_y );
     $image->thumbnailImage ( $width, $height, true );
     $canvas->addImage ( $image );
     $canvas->setImagePage ( $width, $height, 0, 0 );
    }
    $image->destroy ();
    $this->image = $canvas;
  }
 }

 // 添加水印圖片
 public function add_watermark($path, $x = 0, $y = 0) {
  $watermark = new Imagick ( $path );
  $draw = new ImagickDraw ();
  $draw->composite ( $watermark->getImageCompose (), $x, $y, $watermark->getImageWidth (), $watermark->getimageheight (), $watermark );

  if ($this->type == 'gif') {
   $image = $this->image;
   $canvas = new Imagick ();
   $images = $image->coalesceImages ();
   foreach ( $image as $frame ) {
    $img = new Imagick ();
    $img->readImageBlob ( $frame );
    $img->drawImage ( $draw );

    $canvas->addImage ( $img );
    $canvas->setImageDelay ( $img->getImageDelay () );
   }
   $image->destroy ();
   $this->image = $canvas;
  } else {
   $this->image->drawImage ( $draw );
  }
 }

 // 添加水印文字
 public function add_text($text, $x = 0, $y = 0, $angle = 0, $style = array()) {
  $draw = new ImagickDraw ();
  if (isset ( $style ['font'] ))
   $draw->setFont ( $style ['font'] );
  if (isset ( $style ['font_size'] ))
   $draw->setFontSize ( $style ['font_size'] );
  if (isset ( $style ['fill_color'] ))
   $draw->setFillColor ( $style ['fill_color'] );
  if (isset ( $style ['under_color'] ))
   $draw->setTextUnderColor ( $style ['under_color'] );

  if ($this->type == 'gif') {
   foreach ( $this->image as $frame ) {
    $frame->annotateImage ( $draw, $x, $y, $angle, $text );
   }
  } else {
   $this->image->annotateImage ( $draw, $x, $y, $angle, $text );
  }
 }

 // 保存到指定路徑
 public function save_to($path) {
  //壓縮圖片質(zhì)量
  $this->image->setImageFormat('JPEG');
  $this->image->setImageCompression(Imagick::COMPRESSION_JPEG);
  $a = $this->image->getImageCompressionQuality() * 0.60;
  if ($a == 0) {
   $a = 60;
  }
  $this->image->setImageCompressionQuality($a);
  $this->image->stripImage();

  if ($this->type == 'gif') {
   $this->image->writeImages ( $path, true );
  } else {
   $this->image->writeImage ( $path );
  }
 }

 // 輸出圖像
 public function output($header = true) {
  if ($header)
   header ( 'Content-type: ' . $this->type );
  echo $this->image->getImagesBlob ();
 }
 public function get_width() {
  $size = $this->image->getImagePage ();
  return $size ['width'];
 }
 public function get_height() {
  $size = $this->image->getImagePage ();
  return $size ['height'];
 }

 // 設(shè)置圖像類型, 默認(rèn)與源類型一致
 public function set_type($type = 'png') {
  $this->type = $type;
  $this->image->setImageFormat ( $type );
 }

 // 獲取源圖像類型
 public function get_type() {
  return $this->type;
 }

 public function get_file_size(){
  if($this->image){
   return 0;//$this->image->getImageLength(); getImageLength not find
  }else{
   return 0;
  }
 }

 public function get_file_type(){
  if($this->image){
   return $this->image->getimagemimetype();
  }else{
   return 0;
  }
 }

 public function get_sha1(){
  if($this->image){
   return sha1($this->image->__tostring());
  }else{
   return '';
  }
 }

 // 當(dāng)前對象是否為圖片
 public function is_image() {
  if ($this->image)
   return true;
  else
   return false;
 }

 /*
  * 添加一個(gè)邊框 $width: 左右邊框?qū)挾?$height: 上下邊框?qū)挾?$color: 顏色: RGB 顏色 'rgb(255,0,0)' 或 16進(jìn)制顏色 '#FF0000' 或顏色單詞 'white'/'red'...
  */
 public function border($width, $height, $color = 'rgb(220, 220, 220)') {
  $color = new ImagickPixel ();
  $color->setColor ( $color );
  $this->image->borderImage ( $color, $width, $height );
 }
 public function blur($radius, $sigma) {
  $this->image->blurImage ( $radius, $sigma );
 } // 模糊
 public function gaussian_blur($radius, $sigma) {
  $this->image->gaussianBlurImage ( $radius, $sigma );
 } // 高斯模糊
 public function motion_blur($radius, $sigma, $angle) {
  $this->image->motionBlurImage ( $radius, $sigma, $angle );
 } // 運(yùn)動(dòng)模糊
 public function radial_blur($radius) {
  $this->image->radialBlurImage ( $radius );
 } // 徑向模糊
 public function add_noise($type = null) {
  $this->image->addNoiseImage ( $type == null ? imagick::NOISE_IMPULSE : $type );
 } // 添加噪點(diǎn)
 public function level($black_point, $gamma, $white_point) {
  $this->image->levelImage ( $black_point, $gamma, $white_point );
 } // 調(diào)整色階
 public function modulate($brightness, $saturation, $hue) {
  $this->image->modulateImage ( $brightness, $saturation, $hue );
 } // 調(diào)整亮度、飽和度、色調(diào)
 public function charcoal($radius, $sigma) {
  $this->image->charcoalImage ( $radius, $sigma );
 } // 素描
 public function oil_paint($radius) {
  $this->image->oilPaintImage ( $radius );
 } // 油畫效果
 public function flop() {
  $this->image->flopImage ();
 } // 水平翻轉(zhuǎn)
 public function flip() {
  $this->image->flipImage ();
 } // 垂直翻轉(zhuǎn)
}

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲狠狠丁香婷婷综合久久久 | 波多野结衣福利电影 | 久久99深爱久久99精品 | 99精品网| 国产精品久久久久免费a∨ 狠狠影院 | 欧美激情高清 | 国产毛片18片毛一级特黄日韩a | 超碰天天 | 精品第一页 | 亚洲精品视频免费 | 人人爽人人爽人人片av | 亚洲日本韩国在线观看 | 久久成 | 亚洲欧美在线免费 | 美日韩av | 毛片免费观看视频 | 欧美精产国品一二三区 | 二区影院 | 欧美天堂在线观看 | 久久av综合 | 欧美与黑人午夜性猛交久久久 | 自拍偷拍专区 | 欧美日韩成人影院 | 婷婷国产 | 国产尤物一区 | 久久久精品呻吟 | 日本www视频| 在线欧美日韩 | 9色av| 日韩一级精品视频在线观看 | 欧美一区二区三区在线视频 | 五月激情综合 | 亚洲免费影院 | 日韩电影中文字幕 | 国产激情精品一区二区三区 | 欧美成视频 | 亚洲视屏 | 国产精品成av人在线视午夜片 | 亚洲精品福利在线观看 | 亚洲成人在线观看视频 | 91精品在线播放 |