mirror of https://github.com/movim/movim
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.0 KiB
142 lines
4.0 KiB
<?php
|
|
|
|
class Picture {
|
|
private $_path = CACHE_PATH;
|
|
private $_uri = CACHE_URI;
|
|
private $_key;
|
|
private $_bin = false;
|
|
|
|
/**
|
|
* @desc Load a bin picture from a path
|
|
*/
|
|
public function fromPath($path) {
|
|
$handle = fopen($path, "r");
|
|
$this->_bin = fread($handle, filesize($path));
|
|
fclose($handle);
|
|
}
|
|
|
|
/**
|
|
* @desc Load a bin picture from a base64
|
|
*/
|
|
public function fromBase($base = false) {
|
|
if($base) {
|
|
$this->_bin = (string)base64_decode((string)$base);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @desc Convert to a base64
|
|
*/
|
|
public function toBase() {
|
|
if($this->_bin)
|
|
return base64_encode($this->_bin);
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @desc Get a picture of the current size
|
|
* @param $key The key of the picture
|
|
* @param $size The size requested
|
|
* @return The url of the picture
|
|
*/
|
|
public function get($key, $size = false) {
|
|
$this->_key = $key;
|
|
|
|
$original = $this->_path.md5($this->_key).'.jpg';
|
|
|
|
// We request the original picture
|
|
if($size == false) {
|
|
if(file_exists($original)) {
|
|
$this->fromPath($original);
|
|
return $this->_uri.md5($this->_key).'.jpg';
|
|
} else {
|
|
return false;
|
|
}
|
|
// We request a specific size
|
|
} else {
|
|
if(file_exists($this->_path.md5($this->_key).'_'.$size.'.jpg')) {
|
|
$this->fromPath($this->_path.md5($this->_key).'_'.$size.'.jpg');
|
|
return $this->_uri.md5($this->_key).'_'.$size.'.jpg';
|
|
} else {
|
|
if(file_exists($original)) {
|
|
$this->fromPath($original);
|
|
$this->createThumbnail($size);
|
|
|
|
return $this->_uri.md5($this->_key).'_'.$size.'.jpg';
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @desc Save a picture (original size)
|
|
* @param $key The key of the picture
|
|
*/
|
|
public function set($key) {
|
|
$this->_key = $key;
|
|
$path = $this->_path.md5($this->_key).'.jpg';
|
|
|
|
// If the file exist we replace it
|
|
if(file_exists($path) && $this->_bin) {
|
|
unlink($path);
|
|
|
|
// And destroy all the thumbnails
|
|
foreach(
|
|
glob(
|
|
$this->_path.
|
|
md5($key).
|
|
'*.jpg',
|
|
GLOB_NOSORT
|
|
) as $path_thumb) {
|
|
unlink($path_thumb);
|
|
}
|
|
}
|
|
|
|
if($this->_bin) {
|
|
$source = imagecreatefromstring($this->_bin);
|
|
if($source != false) {
|
|
imagejpeg($source, $path, 95);
|
|
imagedestroy($source);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @desc Create a thumbnail of the picture and save it
|
|
* @param $size The size requested
|
|
*/
|
|
private function createThumbnail($size) {
|
|
$path = $this->_path.md5($this->_key).'_'.$size.'.jpg';
|
|
|
|
$thumb = imagecreatetruecolor($size, $size);
|
|
$white = imagecolorallocate($thumb, 255, 255, 255);
|
|
imagefill($thumb, 0, 0, $white);
|
|
imageinterlace($thumb, true);
|
|
|
|
$source = imagecreatefromstring($this->_bin);
|
|
|
|
$width = imagesx($source);
|
|
$height = imagesy($source);
|
|
|
|
if($width >= $height) {
|
|
// For landscape images
|
|
$x_offset = ($width - $height) / 2;
|
|
$y_offset = 0;
|
|
$square_size = $width - ($x_offset * 2);
|
|
} else {
|
|
// For portrait and square images
|
|
$x_offset = 0;
|
|
$y_offset = ($height - $width) / 2;
|
|
$square_size = $height - ($y_offset * 2);
|
|
}
|
|
|
|
if($source) {
|
|
imagecopyresampled($thumb, $source, 0, 0, $x_offset, $y_offset, $size, $size, $square_size, $square_size);
|
|
imagejpeg($thumb, $path, 95);
|
|
imagedestroy($thumb);
|
|
}
|
|
}
|
|
}
|