added image manipulation class

This commit is contained in:
Roland Gruber 2018-08-19 19:13:16 +02:00
parent caa96faa5c
commit 6f8a9549f2
2 changed files with 207 additions and 30 deletions

180
lam/lib/imageutils.inc Normal file
View File

@ -0,0 +1,180 @@
<?php
namespace LAM\ImageUtils;
use Imagick;
/*
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2018 Roland Gruber
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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Image manipulation functions.
*
* @author Roland Gruber
*/
/**
* Factory to create modificators for images.
*
* @author Roland Gruber
*/
class ImageManipulationFactory {
/**
* Returns an image manipulator based on installed PHP modules.
*
* @param string $imageData binary string of image data
* @return ImageManipulator manipulator
*/
public static function getImageManipulator($imageData) {
if (extension_loaded('imagick')) {
return new ImageManipulatorImagick($imageData);
}
}
}
/**
* Modifies images.
*
* @author Roland Gruber
*/
interface ImageManipulator {
/**
* Returns the height of the image.
*
* @return int height
*/
public function getHeight();
/**
* Returns the width of the image.
*
* @return int width
*/
public function getWidth();
/**
* Resizes the image to the given maximum dimensions.
*
* @param int $width width
* @param int $height height
*/
public function thumbnail($width, $height);
/**
* Converts the image to JPEG format.
*/
public function convertToJpeg();
/**
* Crops the image.
*
* @param int $x starting point in original image
* @param int $y starting point in original image
* @param int $width width of target size
* @param int $height height of target size
*/
public function crop($x, $y, $width, $height);
/**
* Returns the image as binary string.
*
* @return string image data
*/
public function getImageData();
}
/**
* Manipulates images using Imagick library.
*
* @author Roland Gruber
*/
class ImageManipulatorImagick implements ImageManipulator {
/**
* Image
*
* @var Imagick image
*/
private $image;
/**
* Constructor.
*
* @param string $imageData original image as binary string
*/
public function __construct($imageData) {
$this->image = new Imagick();
$this->image->readimageblob($imageData);
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::getHeight()
*/
public function getHeight() {
$this->image->getimageheight();
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::getWidth()
*/
public function getWidth() {
$this->image->getimagewidth();
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::getAsJpeg()
*/
public function convertToJpeg() {
$this->image->setImageCompression(Imagick::COMPRESSION_JPEG);
$this->image->setImageFormat('jpeg');
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::crop()
*/
public function crop($x, $y, $width, $height) {
$this->image->cropimage($width, $height, $x, $y);
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::resize()
*/
public function thumbnail($width, $height) {
$this->image->thumbnailimage($width, $height, true);
}
/**
* {@inheritDoc}
* @see \LAM\ImageUtils\ImageManipulator::getImageData()
*/
public function getImageData() {
return $this->image->getimageblob();
}
}
?>

View File

@ -1,5 +1,6 @@
<?php <?php
use \LAM\TYPES\TypeManager; use \LAM\TYPES\TypeManager;
use LAM\ImageUtils\ImageManipulationFactory;
/* /*
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
@ -1644,11 +1645,11 @@ class inetOrgPerson extends baseModule implements passwordService {
} }
if (isset($_POST['form_subpage_' . get_class($this) . '_attributes_crop'])) { if (isset($_POST['form_subpage_' . get_class($this) . '_attributes_crop'])) {
$messages = array(); $messages = array();
$image = new Imagick();
try { try {
$image->readImageBlob($this->attributes['jpegPhoto'][0]); include_once dirname(__FILE__) . '/../imageutils.inc';
$image->cropimage($_POST['croppingDataWidth'], $_POST['croppingDataHeight'], $_POST['croppingDataX'], $_POST['croppingDataY']); $imageManipulator = ImageManipulationFactory::getImageManipulator($this->attributes['jpegPhoto'][0]);
$this->attributes['jpegPhoto'][0] = $image->getimageblob(); $imageManipulator->crop($_POST['croppingDataX'], $_POST['croppingDataY'], $_POST['croppingDataWidth'], $_POST['croppingDataHeight']);
$this->attributes['jpegPhoto'][0] = $imageManipulator->getImageData();
} }
catch (Exception $e) { catch (Exception $e) {
$msg = $this->messages['file'][2]; $msg = $this->messages['file'][2];
@ -1679,18 +1680,17 @@ class inetOrgPerson extends baseModule implements passwordService {
} }
fclose($handle); fclose($handle);
// convert to JPG // convert to JPG
$image = new Imagick();
try { try {
$image->readImageBlob($data); include_once dirname(__FILE__) . '/../imageutils.inc';
$imageManipulator = ImageManipulationFactory::getImageManipulator($data);
// resize if maximum values specified // resize if maximum values specified
if (!empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0]) || !empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0])) { if (!empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0]) || !empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0])) {
$maxWidth = empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0]) ? $image->getimagewidth() : $this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0]; $maxWidth = empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0]) ? $imageManipulator->getWidth() : $this->moduleSettings['inetOrgPerson_jpegPhoto_maxWidth'][0];
$maxHeight = empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0]) ? $image->getimageheight() : $this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0]; $maxHeight = empty($this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0]) ? $imageManipulator->getHeight() : $this->moduleSettings['inetOrgPerson_jpegPhoto_maxHeight'][0];
$image->thumbnailimage($maxWidth, $maxHeight, true); $imageManipulator->thumbnail($maxWidth, $maxHeight);
} }
$image->setImageCompression(Imagick::COMPRESSION_JPEG); $imageManipulator->convertToJpeg();
$image->setImageFormat('jpeg'); $data = $imageManipulator->getImageData();
$data = $image->getimageblob();
} }
catch (Exception $e) { catch (Exception $e) {
$msg = $this->messages['file'][2]; $msg = $this->messages['file'][2];
@ -3392,10 +3392,10 @@ class inetOrgPerson extends baseModule implements passwordService {
elseif (!empty($data) && (empty($attributes['jpegPhoto'][0]) || ($data != $attributes['jpegPhoto'][0]))) { elseif (!empty($data) && (empty($attributes['jpegPhoto'][0]) || ($data != $attributes['jpegPhoto'][0]))) {
$moduleSettings = $this->selfServiceSettings->moduleSettings; $moduleSettings = $this->selfServiceSettings->moduleSettings;
try { try {
$image = new Imagick(); include_once dirname(__FILE__) . '/../imageutils.inc';
$image->readimageblob($data); $imageManipulator = ImageManipulationFactory::getImageManipulator($data);
$image->cropimage($_POST['croppingDataWidth'], $_POST['croppingDataHeight'], $_POST['croppingDataX'], $_POST['croppingDataY']); $imageManipulator->crop($_POST['croppingDataX'], $_POST['croppingDataY'], $_POST['croppingDataWidth'], $_POST['croppingDataHeight']);
$data = $image->getimageblob(); $data = $imageManipulator->getImageData();
$data = inetOrgPerson::resizeAndConvertImage($data, $moduleSettings); $data = inetOrgPerson::resizeAndConvertImage($data, $moduleSettings);
if (!empty($moduleSettings['inetOrgPerson_jpegPhoto_maxSize'][0]) && ($moduleSettings['inetOrgPerson_jpegPhoto_maxSize'][0] < (strlen($data) / 1024))) { if (!empty($moduleSettings['inetOrgPerson_jpegPhoto_maxSize'][0]) && ($moduleSettings['inetOrgPerson_jpegPhoto_maxSize'][0] < (strlen($data) / 1024))) {
$msg = $this->messages['file'][3]; $msg = $this->messages['file'][3];
@ -3527,18 +3527,16 @@ class inetOrgPerson extends baseModule implements passwordService {
* @return array binary image data * @return array binary image data
*/ */
private static function resizeAndConvertImage($data, $settings) { private static function resizeAndConvertImage($data, $settings) {
// convert to JPG if imagick extension is available include_once dirname(__FILE__) . '/../imageutils.inc';
$image = new Imagick(); $imageManipulator = ImageManipulationFactory::getImageManipulator($data);
$image->readImageBlob($data);
// resize if maximum values specified // resize if maximum values specified
if (!empty($settings['inetOrgPerson_jpegPhoto_maxWidth'][0]) || !empty($settings['inetOrgPerson_jpegPhoto_maxHeight'][0])) { if (!empty($settings['inetOrgPerson_jpegPhoto_maxWidth'][0]) || !empty($settings['inetOrgPerson_jpegPhoto_maxHeight'][0])) {
$maxWidth = empty($settings['inetOrgPerson_jpegPhoto_maxWidth'][0]) ? $image->getimagewidth() : $settings['inetOrgPerson_jpegPhoto_maxWidth'][0]; $maxWidth = empty($settings['inetOrgPerson_jpegPhoto_maxWidth'][0]) ? $imageManipulator->getWidth() : $settings['inetOrgPerson_jpegPhoto_maxWidth'][0];
$maxHeight = empty($settings['inetOrgPerson_jpegPhoto_maxHeight'][0]) ? $image->getimageheight() : $settings['inetOrgPerson_jpegPhoto_maxHeight'][0]; $maxHeight = empty($settings['inetOrgPerson_jpegPhoto_maxHeight'][0]) ? $imageManipulator->getHeight() : $settings['inetOrgPerson_jpegPhoto_maxHeight'][0];
$image->thumbnailimage($maxWidth, $maxHeight, true); $imageManipulator->thumbnail($maxWidth, $maxHeight);
} }
$image->setImageCompression(Imagick::COMPRESSION_JPEG); $imageManipulator->convertToJpeg();
$image->setImageFormat('jpeg'); $data = $imageManipulator->getImageData();
$data = $image->getimageblob();
return $data; return $data;
} }
@ -3618,12 +3616,11 @@ class inetOrgPerson extends baseModule implements passwordService {
$handle = fopen($_FILES['qqfile']['tmp_name'], "r"); $handle = fopen($_FILES['qqfile']['tmp_name'], "r");
$data = fread($handle, 100000000); $data = fread($handle, 100000000);
fclose($handle); fclose($handle);
$image = new Imagick();
try { try {
$image->readImageBlob($data); include_once dirname(__FILE__) . '/../imageutils.inc';
$image->setImageCompression(Imagick::COMPRESSION_JPEG); $imageManipulator = ImageManipulationFactory::getImageManipulator($data);
$image->setImageFormat('jpeg'); $imageManipulator->convertToJpeg();
$data = $image->getimageblob(); $data = $imageManipulator->getImageData();
} }
catch (Exception $e) { catch (Exception $e) {
$result = array('success' => false, 'error' => htmlspecialchars($e->getMessage())); $result = array('success' => false, 'error' => htmlspecialchars($e->getMessage()));