sometimes we have no relayEvents
[tine20] / tine20 / Tinebase / ImageHelper.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Cornelius Weiss <c.weiss@metaways.de>
8  * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
9  */
10
11 /**
12  * Helper class for image operations
13  *
14  * @package     Tinebase
15  */
16 class Tinebase_ImageHelper
17 {
18     /**
19      * preserves ratio and cropes image on the oversize side
20      */
21     const RATIOMODE_PRESERVANDCROP = 0;
22     /**
23      * preserves ratio and does not crop image. Resuling image dimension is less
24      * than requested on one dimension as this dim is not filled  
25      */
26     const RATIOMODE_PRESERVNOFILL = 1;
27     /**
28      * scales given image to given size
29      * 
30      * @param  Tinebase_Model_Image $_image
31      * @param  int    $_width desitination width
32      * @param  int    $_height destination height
33      * @param  int    $_ratiomode
34      * @throws  Tinebase_Exception_InvalidArgument
35      */
36     public static function resize(Tinebase_Model_Image $_image, $_width, $_height, $_ratiomode)
37     {
38         $_image->resize($_width, $_height, $_ratiomode);
39     }
40     
41     /**
42      * returns image metadata
43      * 
44      * @param   blob  $_blob
45      * @return  array
46      * @throws  Tinebase_Exception_UnexpectedValue
47      */
48     public static function getImageInfoFromBlob($_blob)
49     {
50         $tmpPath = tempnam(Tinebase_Core::getTempDir(), 'tine20_tmp_gd');
51         
52         if ($tmpPath === FALSE) {
53             throw new Tinebase_Exception('Could not generate temporary file.');
54         }
55         
56         file_put_contents($tmpPath, $_blob);
57         
58         $imgInfo = @getimagesize($tmpPath);
59         unlink($tmpPath);
60         if (! in_array($imgInfo['mime'], self::getSupportedImageMimeTypes())) {
61             throw new Tinebase_Exception_UnexpectedValue('given blob does not contain valid image data.');
62         }
63         if (! (isset($imgInfo['channels']) || array_key_exists('channels', $imgInfo))) {
64             Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Uploaded ' . $imgInfo['mime'] . ' image had no channel information. Setting channels to 3.');
65             $imgInfo['channels'] = 3;
66         }
67         return array(
68             'width'    => $imgInfo[0],
69             'height'   => $imgInfo[1],
70             'bits'     => $imgInfo['bits'],
71             'channels' => $imgInfo['channels'],
72             'mime'     => $imgInfo['mime'],
73             'blob'     => $_blob
74         );
75     }
76     /**
77      * checks wether given file is an image or not
78      * 
79      * @param  string $_file image file
80      * @return bool
81      */
82     public static function isImageFile($_file)
83     {
84         if(!$_file) {
85             return false;
86         }
87         $imgInfo = getimagesize($_file);
88         if (isset($imgInfo['mime']) && in_array($imgInfo['mime'], self::getSupportedImageMimeTypes())) {
89             return true;
90         }
91         return false;
92     }
93
94     /**
95      * returns supported image mime types
96      *
97      * @return array
98      */
99     public static function getSupportedImageMimeTypes()
100     {
101         return array('image/png', 'image/jpeg', 'image/gif');
102     }
103     
104     /**
105      * parses an image link
106      * 
107      * @param  string $link
108      * @return array
109      */
110     public static function parseImageLink($link)
111     {
112         $params = array();
113         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . parse_url($link, PHP_URL_QUERY));
114         parse_str(parse_url($link, PHP_URL_QUERY), $params);
115         $params['isNewImage'] = false;
116         if (isset($params['application']) && $params['application'] == 'Tinebase') {
117             $params['isNewImage'] = true;
118         }
119         return $params;
120     }
121
122     /**
123      * returns binary image data from a image identified by a imagelink
124      * 
125      * @param   array  $imageParams
126      * @return  string binary data
127      * @throws  Tinebase_Exception_UnexpectedValue
128      */
129     public static function getImageData($imageParams)
130     {
131         $tempFile = Tinebase_TempFile::getInstance()->getTempFile($imageParams['id']);
132         
133         if (! Tinebase_ImageHelper::isImageFile($tempFile->path)) {
134             throw new Tinebase_Exception_UnexpectedValue('Given file is not an image.');
135         }
136         
137         return file_get_contents($tempFile->path);
138     }
139 }