Merge pull request #7728 from owncloud/oc_image_show_save_custom_mime
make it possible to influence output type of \OC_Image
This commit is contained in:
commit
43ebd8cb64
3 changed files with 122 additions and 56 deletions
|
@ -35,7 +35,7 @@ class OC_Image {
|
|||
/**
|
||||
* @brief Get mime type for an image file.
|
||||
* @param string|null $filepath The path to a local image file.
|
||||
* @returns string The mime type if the it could be determined, otherwise an empty string.
|
||||
* @return string The mime type if the it could be determined, otherwise an empty string.
|
||||
*/
|
||||
static public function getMimeTypeForFile($filePath) {
|
||||
// exif_imagetype throws "read error!" if file is less than 12 byte
|
||||
|
@ -48,10 +48,11 @@ class OC_Image {
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Constructor.
|
||||
* @param string|resource $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function.
|
||||
* @returns bool False on error
|
||||
*/
|
||||
* @brief Constructor.
|
||||
* @param resource|string $imageref The path to a local file, a base64 encoded string or a resource created by
|
||||
* an imagecreate* function.
|
||||
* @return \OC_Image False on error
|
||||
*/
|
||||
public function __construct($imageRef = null) {
|
||||
//OC_Log::write('core',__METHOD__.'(): start', OC_Log::DEBUG);
|
||||
if(!extension_loaded('gd') || !function_exists('gd_info')) {
|
||||
|
@ -70,7 +71,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Determine whether the object contains an image resource.
|
||||
* @returns bool
|
||||
* @return bool
|
||||
*/
|
||||
public function valid() { // apparently you can't name a method 'empty'...
|
||||
return is_resource($this->resource);
|
||||
|
@ -78,7 +79,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Returns the MIME type of the image or an empty string if no image is loaded.
|
||||
* @returns int
|
||||
* @return int
|
||||
*/
|
||||
public function mimeType() {
|
||||
return $this->valid() ? $this->mimeType : '';
|
||||
|
@ -86,7 +87,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Returns the width of the image or -1 if no image is loaded.
|
||||
* @returns int
|
||||
* @return int
|
||||
*/
|
||||
public function width() {
|
||||
return $this->valid() ? imagesx($this->resource) : -1;
|
||||
|
@ -94,7 +95,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Returns the height of the image or -1 if no image is loaded.
|
||||
* @returns int
|
||||
* @return int
|
||||
*/
|
||||
public function height() {
|
||||
return $this->valid() ? imagesy($this->resource) : -1;
|
||||
|
@ -102,7 +103,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Returns the width when the image orientation is top-left.
|
||||
* @returns int
|
||||
* @return int
|
||||
*/
|
||||
public function widthTopLeft() {
|
||||
$o = $this->getOrientation();
|
||||
|
@ -125,7 +126,7 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Returns the height when the image orientation is top-left.
|
||||
* @returns int
|
||||
* @return int
|
||||
*/
|
||||
public function heightTopLeft() {
|
||||
$o = $this->getOrientation();
|
||||
|
@ -147,34 +148,46 @@ class OC_Image {
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Outputs the image.
|
||||
* @returns bool
|
||||
*/
|
||||
public function show() {
|
||||
header('Content-Type: '.$this->mimeType());
|
||||
return $this->_output();
|
||||
* @brief Outputs the image.
|
||||
* @param string $mimeType
|
||||
* @return bool
|
||||
*/
|
||||
public function show($mimeType=null) {
|
||||
if($mimeType === null) {
|
||||
$mimeType = $this->mimeType();
|
||||
}
|
||||
header('Content-Type: '.$mimeType);
|
||||
return $this->_output(null, $mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Saves the image.
|
||||
* @returns bool
|
||||
* @param string $filePath
|
||||
*/
|
||||
* @brief Saves the image.
|
||||
* @param string $filePath
|
||||
* @param string $mimeType
|
||||
* @return bool
|
||||
*/
|
||||
|
||||
public function save($filePath=null) {
|
||||
public function save($filePath=null, $mimeType=null) {
|
||||
if($mimeType === null) {
|
||||
$mimeType = $this->mimeType();
|
||||
}
|
||||
if($filePath === null && $this->filePath === null) {
|
||||
OC_Log::write('core', __METHOD__.'(): called with no path.', OC_Log::ERROR);
|
||||
return false;
|
||||
} elseif($filePath === null && $this->filePath !== null) {
|
||||
$filePath = $this->filePath;
|
||||
}
|
||||
return $this->_output($filePath);
|
||||
return $this->_output($filePath, $mimeType);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Outputs/saves the image.
|
||||
*/
|
||||
private function _output($filePath=null) {
|
||||
* @brief Outputs/saves the image.
|
||||
* @param string $filePath
|
||||
* @param string $mimeType
|
||||
* @return bool
|
||||
* @throws Exception
|
||||
*/
|
||||
private function _output($filePath=null, $mimeType=null) {
|
||||
if($filePath) {
|
||||
if (!file_exists(dirname($filePath)))
|
||||
mkdir(dirname($filePath), 0777, true);
|
||||
|
@ -192,7 +205,30 @@ class OC_Image {
|
|||
return false;
|
||||
}
|
||||
|
||||
switch($this->imageType) {
|
||||
$imageType = $this->imageType;
|
||||
if($mimeType !== null) {
|
||||
switch($mimeType) {
|
||||
case 'image/gif':
|
||||
$imageType = IMAGETYPE_GIF;
|
||||
break;
|
||||
case 'image/jpeg':
|
||||
$imageType = IMAGETYPE_JPEG;
|
||||
break;
|
||||
case 'image/png':
|
||||
$imageType = IMAGETYPE_PNG;
|
||||
break;
|
||||
case 'image/x-xbitmap':
|
||||
$imageType = IMAGETYPE_XBM;
|
||||
break;
|
||||
case 'image/bmp':
|
||||
$imageType = IMAGETYPE_BMP;
|
||||
break;
|
||||
default:
|
||||
throw new Exception('\OC_Image::_output(): "' . $mimeType . '" is not supported when forcing a specific output format');
|
||||
}
|
||||
}
|
||||
|
||||
switch($imageType) {
|
||||
case IMAGETYPE_GIF:
|
||||
$retVal = imagegif($this->resource, $filePath);
|
||||
break;
|
||||
|
@ -203,7 +239,12 @@ class OC_Image {
|
|||
$retVal = imagepng($this->resource, $filePath);
|
||||
break;
|
||||
case IMAGETYPE_XBM:
|
||||
$retVal = imagexbm($this->resource, $filePath);
|
||||
if (function_exists('imagexbm')) {
|
||||
$retVal = imagexbm($this->resource, $filePath);
|
||||
} else {
|
||||
throw new Exception('\OC_Image::_output(): imagexbm() is not supported.');
|
||||
}
|
||||
|
||||
break;
|
||||
case IMAGETYPE_WBMP:
|
||||
$retVal = imagewbmp($this->resource, $filePath);
|
||||
|
@ -225,14 +266,14 @@ class OC_Image {
|
|||
}
|
||||
|
||||
/**
|
||||
* @returns resource Returns the image resource in any.
|
||||
* @return resource Returns the image resource in any.
|
||||
*/
|
||||
public function resource() {
|
||||
return $this->resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns Returns the raw image data.
|
||||
* @return string Returns the raw image data.
|
||||
*/
|
||||
function data() {
|
||||
ob_start();
|
||||
|
@ -267,7 +308,7 @@ class OC_Image {
|
|||
/**
|
||||
* (I'm open for suggestions on better method name ;)
|
||||
* @brief Get the orientation based on EXIF data.
|
||||
* @returns The orientation or -1 if no EXIF data is available.
|
||||
* @return int The orientation or -1 if no EXIF data is available.
|
||||
*/
|
||||
public function getOrientation() {
|
||||
if(!is_callable('exif_read_data')) {
|
||||
|
@ -295,7 +336,7 @@ class OC_Image {
|
|||
/**
|
||||
* (I'm open for suggestions on better method name ;)
|
||||
* @brief Fixes orientation based on EXIF data.
|
||||
* @returns bool.
|
||||
* @return bool.
|
||||
*/
|
||||
public function fixOrientation() {
|
||||
$o = $this->getOrientation();
|
||||
|
@ -355,10 +396,10 @@ class OC_Image {
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function.
|
||||
* @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function or a file resource (file handle ).
|
||||
* @returns An image resource or false on error
|
||||
*/
|
||||
* @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function.
|
||||
* @param resource|string $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function or a file resource (file handle ).
|
||||
* @return resource|false An image resource or false on error
|
||||
*/
|
||||
public function load($imageRef) {
|
||||
if(is_resource($imageRef)) {
|
||||
if(get_resource_type($imageRef) == 'gd') {
|
||||
|
@ -383,7 +424,7 @@ class OC_Image {
|
|||
* @brief Loads an image from an open file handle.
|
||||
* It is the responsibility of the caller to position the pointer at the correct place and to close the handle again.
|
||||
* @param resource $handle
|
||||
* @returns An image resource or false on error
|
||||
* @return An image resource or false on error
|
||||
*/
|
||||
public function loadFromFileHandle($handle) {
|
||||
OC_Log::write('core', __METHOD__.'(): Trying', OC_Log::DEBUG);
|
||||
|
@ -395,8 +436,8 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Loads an image from a local file.
|
||||
* @param $imagePath The path to a local file.
|
||||
* @returns An image resource or false on error
|
||||
* @param bool|string $imagePath The path to a local file.
|
||||
* @return bool|resource An image resource or false on error
|
||||
*/
|
||||
public function loadFromFile($imagePath=false) {
|
||||
// exif_imagetype throws "read error!" if file is less than 12 byte
|
||||
|
@ -496,8 +537,8 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Loads an image from a string of data.
|
||||
* @param $str A string of image data as read from a file.
|
||||
* @returns An image resource or false on error
|
||||
* @param string $str A string of image data as read from a file.
|
||||
* @return bool|resource An image resource or false on error
|
||||
*/
|
||||
public function loadFromData($str) {
|
||||
if(is_resource($str)) {
|
||||
|
@ -521,8 +562,8 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Loads an image from a base64 encoded string.
|
||||
* @param $str A string base64 encoded string of image data.
|
||||
* @returns An image resource or false on error
|
||||
* @param string $str A string base64 encoded string of image data.
|
||||
* @return bool|resource An image resource or false on error
|
||||
*/
|
||||
public function loadFromBase64($str) {
|
||||
if(!is_string($str)) {
|
||||
|
@ -551,7 +592,7 @@ class OC_Image {
|
|||
* @param string $fileName <p>
|
||||
* Path to the BMP image.
|
||||
* </p>
|
||||
* @return resource an image resource identifier on success, <b>FALSE</b> on errors.
|
||||
* @return bool|resource an image resource identifier on success, <b>FALSE</b> on errors.
|
||||
*/
|
||||
private function imagecreatefrombmp($fileName) {
|
||||
if (!($fh = fopen($fileName, 'rb'))) {
|
||||
|
@ -690,7 +731,7 @@ class OC_Image {
|
|||
/**
|
||||
* @brief Resizes the image preserving ratio.
|
||||
* @param integer $maxSize The maximum size of either the width or height.
|
||||
* @returns bool
|
||||
* @return bool
|
||||
*/
|
||||
public function resize($maxSize) {
|
||||
if(!$this->valid()) {
|
||||
|
@ -713,6 +754,11 @@ class OC_Image {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @return bool
|
||||
*/
|
||||
public function preciseResize($width, $height) {
|
||||
if (!$this->valid()) {
|
||||
OC_Log::write('core', __METHOD__.'(): No image loaded', OC_Log::ERROR);
|
||||
|
@ -748,8 +794,8 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Crops the image to the middle square. If the image is already square it just returns.
|
||||
* @param int maximum size for the result (optional)
|
||||
* @returns bool for success or failure
|
||||
* @param int $size maximum size for the result (optional)
|
||||
* @return bool for success or failure
|
||||
*/
|
||||
public function centerCrop($size=0) {
|
||||
if(!$this->valid()) {
|
||||
|
@ -807,11 +853,11 @@ class OC_Image {
|
|||
|
||||
/**
|
||||
* @brief Crops the image from point $x$y with dimension $wx$h.
|
||||
* @param $x Horizontal position
|
||||
* @param $y Vertical position
|
||||
* @param $w Width
|
||||
* @param $h Height
|
||||
* @returns bool for success or failure
|
||||
* @param int $x Horizontal position
|
||||
* @param int $y Vertical position
|
||||
* @param int $w Width
|
||||
* @param int $h Height
|
||||
* @return bool for success or failure
|
||||
*/
|
||||
public function crop($x, $y, $w, $h) {
|
||||
if(!$this->valid()) {
|
||||
|
@ -839,7 +885,7 @@ class OC_Image {
|
|||
* @brief Resizes the image to fit within a boundry while preserving ratio.
|
||||
* @param integer $maxWidth
|
||||
* @param integer $maxHeight
|
||||
* @returns bool
|
||||
* @return bool
|
||||
*/
|
||||
public function fitIn($maxWidth, $maxHeight) {
|
||||
if(!$this->valid()) {
|
||||
|
|
|
@ -463,7 +463,7 @@ class Preview {
|
|||
if (is_null($this->preview)) {
|
||||
$this->getPreview();
|
||||
}
|
||||
$this->preview->show();
|
||||
$this->preview->show('image/png');
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
|
||||
class Test_Image extends PHPUnit_Framework_TestCase {
|
||||
public static function tearDownAfterClass() {
|
||||
unlink(OC::$SERVERROOT.'/tests/data/testimage2.png');
|
||||
unlink(OC::$SERVERROOT.'/tests/data/testimage2.jpg');
|
||||
@unlink(OC::$SERVERROOT.'/tests/data/testimage2.png');
|
||||
@unlink(OC::$SERVERROOT.'/tests/data/testimage2.jpg');
|
||||
}
|
||||
|
||||
public function testGetMimeTypeForFile() {
|
||||
|
@ -236,4 +236,24 @@ class Test_Image extends PHPUnit_Framework_TestCase {
|
|||
$this->assertEquals(200, $img->width());
|
||||
$this->assertEquals(200, $img->height());
|
||||
}
|
||||
|
||||
function convertDataProvider() {
|
||||
return array(
|
||||
array( 'image/gif'),
|
||||
array( 'image/jpeg'),
|
||||
array( 'image/png'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider convertDataProvider
|
||||
*/
|
||||
public function testConvert($mimeType) {
|
||||
$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$tempFile = tempnam(sys_get_temp_dir(), 'img-test');
|
||||
|
||||
$img->save($tempFile, $mimeType);
|
||||
$actualMimeType = \OC_Image::getMimeTypeForFile($tempFile);
|
||||
$this->assertEquals($mimeType, $actualMimeType);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue