Jump to content


Photo
- - - - -

JBimage - crop - resize - JBZoo Image

jbzoo image

Best Answer CB9TOIIIA , 10 February 2016 - 14:47

Первым решением обошелся:

 

X2n9tyE.png
 

 

Изменил 250 строки на:


	        // smart resize thumbnail image
	        // my rules for slider resize
			if ($this->thumb_resize) {
				$resized_width  = @($this->thumb_height / $this->img_height  ) * $this->img_width;
				$resized_height = @($this->thumb_width / $this->img_width) * $this->img_height;

				if ($this->thumb_width <= $resized_width) {
					$width  = $resized_width;
					$height = $this->thumb_height;
					$src_x  = intval(($resized_width - $this->thumb_width) / $this->thumb_width);
				} else {
					$width  = $this->thumb_width;
					$height = $resized_height;
					$src_y  = intval(($resized_height - $this->thumb_height) / $this->thumb_height);
				}

Полный файл:

<?php
/**
 * @package   com_zoo
 * @author    YOOtheme http://www.yootheme.com
 * @copyright Copyright (C) YOOtheme GmbH
 * @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
 */

/**
 * Image thumbnail helper class.
 *
 * @package Component.Helpers
 * @since 2.0
 */
class ImageThumbnailHelper extends AppHelper {

	/**
	 * Creates an AppImageThumbnail instance
	 *
	 * @param string $file The filepath
	 *
	 * @return AppImageThumbnail
	 *
	 * @since 2.0
	 */
	public function create($file) {
		return $this->app->object->create('AppImageThumbnail', array($file));
	}

	/**
	 * Checks for the required php functions
	 *
	 * @return boolean
	 *
	 * @since 2.0
	 */
    public function check() {
		$gd_functions = array(
			'getimagesize',
			'imagecreatefromgif',
			'imagecreatefromjpeg',
			'imagecreatefrompng',
			'imagecreatetruecolor',
			'imagecopyresized',
			'imagecopy',
			'imagegif',
			'imagejpeg',
			'imagepng'
			);

		foreach ($gd_functions as $name) {
			if (!function_exists($name)) return false;
		}

		return true;
    }

}

/**
 * Image thumbnail class.
 *
 * @package Component.Helpers
 * @since 2.0
 */
class AppImageThumbnail {

	/**
	 * App instance
	 *
	 * @var App
	 * @since 2.0
	 */
	public $app;

	/**
	 * The image file path
	 * @var string
	 */
	public $img_file;

	/**
	 * The image format
	 * @var string
	 */
	public $img_format;

	/**
	 * The image source
	 * @var resource
	 */
	public $img_source;

	/**
	 * The image width
	 * @var string
	 */
	public $img_width;

	/**
	 * The image height
	 * @var string
	 */
	public $img_height;

	/**
	 * The thumb width
	 * @var string
	 */
	public $thumb_width;

	/**
	 * The thumb height
	 * @var string
	 */
	public $thumb_height;

	/**
	 * The thumb resize
	 * @var boolean
	 */
	public $thumb_resize;

	/**
	 * The thumb quality
	 * @var int
	 */
	public $thumb_quality;

	/**
	 * Class constructor
	 *
	 * @param string $file The file path.
	 * @since 2.0
	 */
    public function __construct($file) {

        $this->img_file      = $file;
        $this->thumb_resize  = true;
        $this->thumb_quality = 100;

		// get image info
		list($width, $height, $type, $attr) = @getimagesize($this->img_file, $info);

		// set image dimensions and type
		if (is_array($info)) {

	        $this->img_width    = $width;
	        $this->img_height   = $height;
	        $this->thumb_width  = $width;
	        $this->thumb_height = $height;

			switch ($type) {
	            case 1:
	                $this->img_format = 'gif';
	            	$this->img_source = imagecreatefromgif($this->img_file);
	                break;
	            case 2:
                	$this->img_format = 'jpeg';
	            	$this->img_source = imagecreatefromjpeg($this->img_file);
	                break;
	            case 3:
            		$this->img_format = 'png';
	            	$this->img_source = imagecreatefrompng($this->img_file);
	                break;
	            default:
	                $this->img_format = null;
	            	$this->img_source = null;
	                break;
	        }
		}
    }

	/**
	 * Set resize
	 *
	 * @param boolean $resize Resize value
	 *
	 * @return void
	 * @since 2.0
	 */
    public function setResize($resize) {
		$this->thumb_resize = $resize;
    }

	/**
	 * Set thumb dimensions
	 *
	 * @param int $width
	 * @param int $height
	 *
	 * @return void
	 * @since 2.0
	 */
    public function setSize($width, $height) {
		$this->thumb_width  = $width;
		$this->thumb_height = $height;
    }

	/**
	 * Size thumb width
	 *
	 * @param int $width
	 *
	 * @return void
	 * @since 2.0
	 */
    public function sizeWidth($width) {
		$this->thumb_width  = $width;
		$this->thumb_height = @($width / $this->img_width) * $this->img_height;
    }

	/**
	 * Size thumb height
	 *
	 * @param int $height
	 *
	 * @return void
	 * @since 2.0
	 */
    public function sizeHeight($height) {
		$this->thumb_width  = @($height / $this->img_height) * $this->img_width;
		$this->thumb_height = $height;
    }

	/**
	 * Save file
	 *
	 * @param string $file the file to save
	 *
	 * @return boolean true on success
	 * @since 2.0
	 */
    public function save($file) {
		$return = false;

		if ($this->img_format) {

			$src   = $this->img_source;
			$src_x = 0;
			$src_y = 0;

	        // smart resize thumbnail image
	        // my rules for slider resize
			if ($this->thumb_resize) {
				$resized_width  = @($this->thumb_height / $this->img_height  ) * $this->img_width;
				$resized_height = @($this->thumb_width / $this->img_width) * $this->img_height;

				if ($this->thumb_width <= $resized_width) {
					$width  = $resized_width;
					$height = $this->thumb_height;
					$src_x  = intval(($resized_width - $this->thumb_width) / $this->thumb_width);
				} else {
					$width  = $this->thumb_width;
					$height = $resized_height;
					$src_y  = intval(($resized_height - $this->thumb_height) / $this->thumb_height);
				}

				$src = imagecreatetruecolor($width, $height);

				// save transparent colors
				if ($this->img_format == 'png') {
					imagecolortransparent($src, imagecolorallocate($src, 0, 0, 0));
					imagealphablending($src, false);
					imagesavealpha($src, true);
				}

				// get and reallocate transparency-color for gif
				if ($this->img_format == 'gif') {
					imagealphablending($src, false);
					$transindex = imagecolortransparent($this->img_source) <= imagecolorstotal($src) ? imagecolortransparent($this->img_source) : imagecolorstotal($src);
					if ($transindex >= 0) {
						$transcol = imagecolorsforindex($this->img_source, $transindex);
						$transindex = imagecolorallocatealpha($src, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
						imagefill($src, 0, 0, $transindex);
					}
				}

				if (function_exists('imagecopyresampled')) {
					@imagecopyresampled($src, $this->img_source, 0, 0, 0, 0, $width, $height, $this->img_width, $this->img_height);
				} else {
					@imagecopyresized($src, $this->img_source, 0, 0, 0, 0, $width, $height, $this->img_width, $this->img_height);
				}

				// restore transparency for gif
				if ($this->img_format == 'gif') {
					if ($transindex >= 0) {
						imagecolortransparent($src, $transindex);
						for ($y=0; $y < imagesy($src); ++$y) {
							for ($x=0; $x < imagesx($src); ++$x) {
								if (((imagecolorat($src, $x, $y)>>24) & 0x7F) >= 100) {
									imagesetpixel($src, $x, $y, $transindex);
								}
							}
						}
					}
				}
			}

	        // create thumbnail image
			$thumbnail = imagecreatetruecolor($this->thumb_width, $this->thumb_height);

			// save transparent colors for png
			if ($this->img_format == 'png') {
				imagecolortransparent($thumbnail, imagecolorallocate($src, 0, 0, 0));
				imagealphablending($thumbnail, false);
				imagesavealpha($thumbnail, true);
			}

			// get and reallocate transparency-color for gif
			if ($this->img_format == 'gif') {
				imagealphablending($thumbnail, false);
				$transindex = imagecolortransparent($src);
				if ($transindex >= 0) {
					$transcol = imagecolorsforindex($src, $transindex);
					$transindex = imagecolorallocatealpha($thumbnail, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
					imagefill($thumbnail, 0, 0, $transindex);
				}
			}

			@imagecopy($thumbnail, $src, 0, 0, $src_x, $src_y, $this->thumb_width, $this->thumb_height);

			// restore transparency for gif
			if ($this->img_format == 'gif') {
				if ($transindex >= 0) {
					imagecolortransparent($thumbnail, $transindex);
					for ($y=0; $y < imagesy($thumbnail); ++$y) {
						for ($x=0; $x < imagesx($thumbnail); ++$x) {
							if (((imagecolorat($thumbnail, $x, $y)>>24) & 0x7F) >= 100) {
								imagesetpixel($thumbnail, $x, $y, $transindex);
							}
						}
					}
				}
			}

			// save thumbnail to file
			ob_start();
			switch ($this->img_format) {
	            case 'gif':
	            	$return = imagegif($thumbnail);
	                break;
	            case 'jpeg':
	       			$return = imagejpeg($thumbnail, null, $this->thumb_quality);
	                break;
	            case 'png':
	    			$return = imagepng($thumbnail);
					break;
	        }
			$output = ob_get_contents();
			ob_end_clean();
			JFile::write($file, $output);

			// free memory resources
			imagedestroy($thumbnail);
			imagedestroy($src);
		}

		return $return;
    }

}
Go to the full post


13 replies to this topic

#11 SmetDenis

SmetDenis
  • Administrators
  • User rate: 139.4
  • posts: 16232
  • topics: 200

Posted 11 February 2016 - 19:07

А если сделать опцию глобальную или внутри элемента Image ?

В текущем варианте ZOO не получится, но в будущем, вполне.

 

Визуальный кроп - можно, если много времени не съест.


  • 1
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#12 CB9TOIIIA

CB9TOIIIA
  • Topic Starter
  • Administrators
  • User rate: 230.6
  • posts: 3680
  • topics: 235

Posted 11 February 2016 - 20:24

Опция думаю внутри элемента - чтобы на слайдер одно, для фулл иное или тизера
  • 1

#13 woodman

woodman
  • JBZoo User (rus)
  • User rate: 38.4
  • posts: 648
  • topics: 59

Posted 11 February 2016 - 20:30

Согласен, опция только локальная должны быть. У меня уже не раз возникала необходимость в одном и том же элементе, но в разных выводах делать разные пропорции картинки. Также, всякие ручные кропы должны быть только опциональны, т.к. единицы при ручном заполнении материалов будут еще выбирать, какую часть картинки кропнуть - очень уже времяемкий это получится процесс. И да, кроп всегда должен быть от центра. Только так можно максимум композиции охватить (исключения бывают, я не спорю).


  • 4

#14 Staff

Staff
  • JBZoo User (rus)
  • User rate: 2.5
  • posts: 97
  • topics: 27

Posted 13 February 2016 - 02:35

Как раз работаю над кропом для 3.0 и задался этим вопросом.

Каким образом сделать кроп удобным, когда при ресайзе меняются пропорции картинки ?

 

Лучше сделать параметры, которые будет указывать пользователь.

  1. Соотношение сторон: 3х4 4х3 6х11 и т.д. но чтобы можно было ввести самому
  2. Ручной визуальный кропинг (как вконтакте при загрузке авы): 
  • а) с предуставленными параметрами соотношения сторон
  • б) произвольный кропинг

При подаче материала пользователем - это вообще отличная вещь.


Edited by Staff, 13 February 2016 - 02:36.

  • 2





Also tagged with one or more of these keywords: jbzoo image

Click to return to top of page in style!