-
-
Save miguelfrmn/908143 to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* File: SimpleImage.php | |
* Author: Simon Jarvis | |
* Modified by: Miguel Fermín | |
* Based in: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php | |
* | |
* This program is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU General Public License | |
* as published by the Free Software Foundation; either version 2 | |
* of the License, or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details: | |
* http://www.gnu.org/licenses/gpl.html | |
*/ | |
class SimpleImage { | |
public $image; | |
public $image_type; | |
public function __construct($filename = null){ | |
if (!empty($filename)) { | |
$this->load($filename); | |
} | |
} | |
public function load($filename) { | |
$image_info = getimagesize($filename); | |
$this->image_type = $image_info[2]; | |
if ($this->image_type == IMAGETYPE_JPEG) { | |
$this->image = imagecreatefromjpeg($filename); | |
} elseif ($this->image_type == IMAGETYPE_GIF) { | |
$this->image = imagecreatefromgif($filename); | |
} elseif ($this->image_type == IMAGETYPE_PNG) { | |
$this->image = imagecreatefrompng($filename); | |
} else { | |
throw new Exception("The file you're trying to open is not supported"); | |
} | |
} | |
public function save($filename, $image_type = IMAGETYPE_JPEG, $compression = 75, $permissions = null) { | |
if ($image_type == IMAGETYPE_JPEG) { | |
imagejpeg($this->image,$filename,$compression); | |
} elseif ($image_type == IMAGETYPE_GIF) { | |
imagegif($this->image,$filename); | |
} elseif ($image_type == IMAGETYPE_PNG) { | |
imagepng($this->image,$filename); | |
} | |
if ($permissions != null) { | |
chmod($filename,$permissions); | |
} | |
} | |
public function output($image_type=IMAGETYPE_JPEG, $quality = 80) { | |
if ($image_type == IMAGETYPE_JPEG) { | |
header("Content-type: image/jpeg"); | |
imagejpeg($this->image, null, $quality); | |
} elseif ($image_type == IMAGETYPE_GIF) { | |
header("Content-type: image/gif"); | |
imagegif($this->image); | |
} elseif ($image_type == IMAGETYPE_PNG) { | |
header("Content-type: image/png"); | |
imagepng($this->image); | |
} | |
} | |
public function getWidth() { | |
return imagesx($this->image); | |
} | |
public function getHeight() { | |
return imagesy($this->image); | |
} | |
public function resizeToHeight($height) { | |
$ratio = $height / $this->getHeight(); | |
$width = round($this->getWidth() * $ratio); | |
$this->resize($width,$height); | |
} | |
public function resizeToWidth($width) { | |
$ratio = $width / $this->getWidth(); | |
$height = round($this->getHeight() * $ratio); | |
$this->resize($width,$height); | |
} | |
public function square($size) { | |
$new_image = imagecreatetruecolor($size, $size); | |
if ($this->getWidth() > $this->getHeight()) { | |
$this->resizeToHeight($size); | |
imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0)); | |
imagealphablending($new_image, false); | |
imagesavealpha($new_image, true); | |
imagecopy($new_image, $this->image, 0, 0, ($this->getWidth() - $size) / 2, 0, $size, $size); | |
} else { | |
$this->resizeToWidth($size); | |
imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0)); | |
imagealphablending($new_image, false); | |
imagesavealpha($new_image, true); | |
imagecopy($new_image, $this->image, 0, 0, 0, ($this->getHeight() - $size) / 2, $size, $size); | |
} | |
$this->image = $new_image; | |
} | |
public function scale($scale) { | |
$width = $this->getWidth() * $scale/100; | |
$height = $this->getHeight() * $scale/100; | |
$this->resize($width,$height); | |
} | |
public function resize($width,$height) { | |
$new_image = imagecreatetruecolor($width, $height); | |
imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0)); | |
imagealphablending($new_image, false); | |
imagesavealpha($new_image, true); | |
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); | |
$this->image = $new_image; | |
} | |
public function cut($x, $y, $width, $height) { | |
$new_image = imagecreatetruecolor($width, $height); | |
imagecolortransparent($new_image, imagecolorallocate($new_image, 0, 0, 0)); | |
imagealphablending($new_image, false); | |
imagesavealpha($new_image, true); | |
imagecopy($new_image, $this->image, 0, 0, $x, $y, $width, $height); | |
$this->image = $new_image; | |
} | |
public function maxarea($width, $height = null) { | |
$height = $height ? $height : $width; | |
if ($this->getWidth() > $width) { | |
$this->resizeToWidth($width); | |
} | |
if ($this->getHeight() > $height) { | |
$this->resizeToheight($height); | |
} | |
} | |
public function minarea($width, $height = null) { | |
$height = $height ? $height : $width; | |
if ($this->getWidth() < $width) { | |
$this->resizeToWidth($width); | |
} | |
if ($this->getHeight() < $height) { | |
$this->resizeToheight($height); | |
} | |
} | |
public function cutFromCenter($width, $height) { | |
if ($width < $this->getWidth() && $width > $height) { | |
$this->resizeToWidth($width); | |
} | |
if ($height < $this->getHeight() && $width < $height) { | |
$this->resizeToHeight($height); | |
} | |
$x = ($this->getWidth() / 2) - ($width / 2); | |
$y = ($this->getHeight() / 2) - ($height / 2); | |
return $this->cut($x, $y, $width, $height); | |
} | |
public function maxareafill($width, $height, $red = 0, $green = 0, $blue = 0) { | |
$this->maxarea($width, $height); | |
$new_image = imagecreatetruecolor($width, $height); | |
$color_fill = imagecolorallocate($new_image, $red, $green, $blue); | |
imagefill($new_image, 0, 0, $color_fill); | |
imagecopyresampled( $new_image, | |
$this->image, | |
floor(($width - $this->getWidth())/2), | |
floor(($height-$this->getHeight())/2), | |
0, 0, | |
$this->getWidth(), | |
$this->getHeight(), | |
$this->getWidth(), | |
$this->getHeight() | |
); | |
$this->image = $new_image; | |
} | |
} | |
// Usage: | |
// Load the original image | |
$image = new SimpleImage('lemon.jpg'); | |
// Resize the image to 600px width and the proportional height | |
$image->resizeToWidth(600); | |
$image->save('lemon_resized.jpg'); | |
// Create a squared version of the image | |
$image->square(200); | |
$image->save('lemon_squared.jpg'); | |
// Scales the image to 75% | |
$image->scale(75); | |
$image->save('lemon_scaled.jpg'); | |
// Resize the image to specific width and height | |
$image->resize(80,60); | |
$image->save('lemon_resized2.jpg'); | |
// Resize the canvas and fill the empty space with a color of your choice | |
$image->maxareafill(600,400, 32, 39, 240); | |
$image->save('lemon_filled.jpg'); | |
// Output the image to the browser: | |
$image->output(); |
I offer a to screen output rather then using headers. Post kepts eating my img tags =( lol
public function output($image_type = IMAGETYPE_JPEG, $quality = 80) { if ($image_type == IMAGETYPE_JPEG) { //header("Content-type: image/jpeg"); // start buffering ob_start(); // output jpeg (or any other chosen) format & quality imagejpeg($this->image, NULL, 85); // capture output to string $contents = ob_get_contents(); // end capture ob_end_clean(); // be tidy; free up memory imagedestroy($this->image); $data = base64_encode($contents); echo '<img src="data:image/jpg;base64,'. $data .'" />'; } elseif ($image_type == IMAGETYPE_GIF) { //header("Content-type: image/gif"); // start buffering ob_start(); // output gif (or any other chosen) format & quality imagegif($this->image); // capture output to string $contents = ob_get_contents(); // end capture ob_end_clean(); // be tidy; free up memory imagedestroy($this->image); $data = base64_encode($contents); echo '<img src="data:image/gif;base64,'. $data .'" />'; } elseif ($image_type == IMAGETYPE_PNG) { //header("Content-type: image/png"); // start buffering ob_start(); // output png (or any other chosen) format & quality imagepng($this->image); // capture output to string $contents = ob_get_contents(); // end capture ob_end_clean(); // be tidy; free up memory imagedestroy($this->image); $data = base64_encode($contents); echo '<img src="data:image/png;base64,'. $data .'" />'; } }
Hello
I wanted to use this function for my image by downloading the images with file_get_contents
My code does not work
$url=ImageCreateFromString(file_get_contents('http://www.bicivendita.it/WebRoot/registerit3/Shops/990241304/509A/9674/BCB8/5136/52FE/C0A8/8007/4E62/BICICLETTE_DA_CITTA_LEGGERE_DA_UOMO_FUORISERIE.jpg'));
$image = new SimpleImage($url);
It's possible?
Regards
Great code. Thanks
Hi i added new function text watermark
`function watermark_text($waterMarkText, $font=4, $r=158, $g=158, $b=158) {
$width = imagefontwidth($font) * strlen($waterMarkText) ;
$height = imagefontheight($font) ;
$image=$this->image;
$x = $this->getWidth() - $width - 10;
$y = $this->getHeight() - $height - 10;
$backgroundColor = imagecolorallocate ($image, 255,255,255);
$textColor = imagecolorallocate ($image, $r,$g,$b);
imagestring ($image, $font, $x, $y, $waterMarkText, $textColor);
$this->image = $image;
}`
Use:
$img->watermark_text('For Example.com', 8, 215, 13, 213)
Miguel, gracias por la librería. Considera incluir la aportación de LeChatNoir69
LeChatNoir69
Perfect fix.
Tks!!!!
Hi guys.
I was using simpleimage to do some image formatting on my project. Currently I have a setup using
resize()
which I intend to resize all image to 700x600 pixels. I have manage to setup everything and the project is LIVE'd already but during production, there was a case where the image would resize to 699x600 while the others are all 700x600 thus breaking the layout.Was wondering if anyone faced this before?
Thanks