Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117751117
rcube_image.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
rcube_image.php
View Options
<?php
/*
+-----------------------------------------------------------------------+
| program/include/rcube_image.php |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2012, The Roundcube Dev Team |
| Copyright (C) 2011-2012, Kolab Systems AG |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| Image resizer and converter |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> |
+-----------------------------------------------------------------------+
*/
class
rcube_image
{
private
$image_file
;
const
TYPE_GIF
=
1
;
const
TYPE_JPG
=
2
;
const
TYPE_PNG
=
3
;
const
TYPE_TIF
=
4
;
public
static
$extensions
=
array
(
self
::
TYPE_GIF
=>
'gif'
,
self
::
TYPE_JPG
=>
'jpg'
,
self
::
TYPE_PNG
=>
'png'
,
self
::
TYPE_TIF
=>
'tif'
,
);
function
__construct
(
$filename
)
{
$this
->
image_file
=
$filename
;
}
/**
* Get image properties.
*
* @return mixed Hash array with image props like type, width, height
*/
public
function
props
()
{
// use GD extension
if
(
function_exists
(
'getimagesize'
)
&&
(
$imsize
=
@
getimagesize
(
$this
->
image_file
)))
{
$width
=
$imsize
[
0
];
$height
=
$imsize
[
1
];
$gd_type
=
$imsize
[
'2'
];
$type
=
image_type_to_extension
(
$imsize
[
'2'
],
false
);
}
// use ImageMagick
if
(!
$type
&&
(
$data
=
$this
->
identify
()))
{
list
(
$type
,
$width
,
$height
)
=
$data
;
}
if
(
$type
)
{
return
array
(
'type'
=>
$type
,
'gd_type'
=>
$gd_type
,
'width'
=>
$width
,
'height'
=>
$height
,
);
}
}
/**
* Resize image to a given size
*
* @param int $size Max width/height size
* @param string $filename Output filename
*
* @return bool True on success, False on failure
*/
public
function
resize
(
$size
,
$filename
=
null
)
{
$result
=
false
;
$rcube
=
rcube
::
get_instance
();
$convert
=
$rcube
->
config
->
get
(
'im_convert_path'
,
false
);
$props
=
$this
->
props
();
if
(!
$filename
)
{
$filename
=
$this
->
image_file
;
}
// use Imagemagick
if
(
$convert
)
{
$p
[
'out'
]
=
$filename
;
$p
[
'in'
]
=
$this
->
image_file
;
$p
[
'size'
]
=
$size
.
'x'
.
$size
;
$type
=
$props
[
'type'
];
if
(!
$type
&&
(
$data
=
$this
->
identify
()))
{
$type
=
$data
[
0
];
}
$type
=
strtr
(
$type
,
array
(
"jpeg"
=>
"jpg"
,
"tiff"
=>
"tif"
,
"ps"
=>
"eps"
,
"ept"
=>
"eps"
));
$p
+=
array
(
'type'
=>
$type
,
'types'
=>
"bmp,eps,gif,jp2,jpg,png,svg,tif"
,
'quality'
=>
75
);
$p
[
'-opts'
]
=
array
(
'-resize'
=>
$size
.
'>'
);
if
(
in_array
(
$type
,
explode
(
','
,
$p
[
'types'
])))
{
// Valid type?
$result
=
rcube
::
exec
(
$convert
.
' 2>&1 -flatten -auto-orient -colorspace RGB -quality {quality} {-opts} {in} {type}:{out}'
,
$p
);
}
if
(
$result
===
''
)
{
return
true
;
}
}
// use GD extension
$gd_types
=
array
(
IMAGETYPE_JPEG
,
IMAGETYPE_GIF
,
IMAGETYPE_PNG
);
if
(
$props
[
'gd_type'
]
&&
in_array
(
$props
[
'gd_type'
],
$gd_types
))
{
if
(
$props
[
'gd_type'
]
==
IMAGETYPE_JPEG
)
{
$image
=
imagecreatefromjpeg
(
$this
->
image_file
);
}
elseif
(
$props
[
'gd_type'
]
==
IMAGETYPE_GIF
)
{
$image
=
imagecreatefromgif
(
$this
->
image_file
);
}
elseif
(
$props
[
'gd_type'
]
==
IMAGETYPE_PNG
)
{
$image
=
imagecreatefrompng
(
$this
->
image_file
);
}
$scale
=
$size
/
max
(
$props
[
'width'
],
$props
[
'height'
]);
$width
=
$props
[
'width'
]
*
$scale
;
$height
=
$props
[
'height'
]
*
$scale
;
$new_image
=
imagecreatetruecolor
(
$width
,
$height
);
// Fix transparency of gif/png image
if
(
$props
[
'gd_type'
]
!=
IMAGETYPE_JPEG
)
{
imagealphablending
(
$new_image
,
false
);
imagesavealpha
(
$new_image
,
true
);
$transparent
=
imagecolorallocatealpha
(
$new_image
,
255
,
255
,
255
,
127
);
imagefilledrectangle
(
$new_image
,
0
,
0
,
$width
,
$height
,
$transparent
);
}
imagecopyresampled
(
$new_image
,
$image
,
0
,
0
,
0
,
0
,
$width
,
$height
,
$props
[
'width'
],
$props
[
'height'
]);
$image
=
$new_image
;
if
(
$props
[
'gd_type'
]
==
IMAGETYPE_JPEG
)
{
$result
=
imagejpeg
(
$image
,
$filename
,
75
);
}
elseif
(
$props
[
'gd_type'
]
==
IMAGETYPE_GIF
)
{
$result
=
imagegif
(
$image
,
$filename
);
}
elseif
(
$props
[
'gd_type'
]
==
IMAGETYPE_PNG
)
{
$result
=
imagepng
(
$image
,
$filename
,
6
,
PNG_ALL_FILTERS
);
}
if
(
$result
)
{
return
true
;
}
}
// @TODO: print error to the log?
return
false
;
}
/**
* Convert image to a given type
*
* @param int $type Destination file type (see class constants)
* @param string $filename Output filename (if empty, original file will be used
* and filename extension will be modified)
*
* @return bool True on success, False on failure
*/
public
function
convert
(
$type
,
$filename
=
null
)
{
$rcube
=
rcube
::
get_instance
();
$convert
=
$rcube
->
config
->
get
(
'im_convert_path'
,
false
);
if
(!
$filename
)
{
$filename
=
$this
->
image_file
;
// modify extension
if
(
$extension
=
self
::
$extensions
[
$type
])
{
$filename
=
preg_replace
(
'/
\.
[^.]+$/'
,
''
,
$filename
)
.
'.'
.
$extension
;
}
}
// use ImageMagick
if
(
$convert
)
{
$p
[
'in'
]
=
$this
->
image_file
;
$p
[
'out'
]
=
$filename
;
$p
[
'type'
]
=
self
::
$extensions
[
$type
];
$result
=
rcube
::
exec
(
$convert
.
' 2>&1 -colorspace RGB -quality 75 {in} {type}:{out}'
,
$p
);
if
(
$result
===
''
)
{
return
true
;
}
}
// use GD extension (TIFF isn't supported)
$props
=
$this
->
props
();
$gd_types
=
array
(
IMAGETYPE_JPEG
,
IMAGETYPE_GIF
,
IMAGETYPE_PNG
);
if
(
$props
[
'gd_type'
]
&&
in_array
(
$props
[
'gd_type'
],
$gd_types
))
{
if
(
$props
[
'gd_type'
]
==
IMAGETYPE_JPEG
)
{
$image
=
imagecreatefromjpeg
(
$this
->
image_file
);
}
else
if
(
$props
[
'gd_type'
]
==
IMAGETYPE_GIF
)
{
$image
=
imagecreatefromgif
(
$this
->
image_file
);
}
else
if
(
$props
[
'gd_type'
]
==
IMAGETYPE_PNG
)
{
$image
=
imagecreatefrompng
(
$this
->
image_file
);
}
if
(
$type
==
self
::
TYPE_JPG
)
{
$result
=
imagejpeg
(
$image
,
$filename
,
75
);
}
else
if
(
$type
==
self
::
TYPE_GIF
)
{
$result
=
imagegif
(
$image
,
$filename
);
}
else
if
(
$type
==
self
::
TYPE_PNG
)
{
$result
=
imagepng
(
$image
,
$filename
,
6
,
PNG_ALL_FILTERS
);
}
}
// @TODO: print error to the log?
return
false
;
}
/**
* Identify command handler.
*/
private
function
identify
()
{
$rcube
=
rcube
::
get_instance
();
if
(
$cmd
=
$rcube
->
config
->
get
(
'im_identify_path'
))
{
$args
=
array
(
'in'
=>
$this
->
image_file
,
'format'
=>
"%m %[fx:w] %[fx:h]"
);
$id
=
rcube
::
exec
(
$cmd
.
' 2>/dev/null -format {format} {in}'
,
$args
);
if
(
$id
)
{
return
explode
(
' '
,
strtolower
(
$id
));
}
}
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Apr 4, 2:51 AM (3 d, 18 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
f0/19/bb030f7c3dd4940590c70f97a6ed
Default Alt Text
rcube_image.php (8 KB)
Attached To
Mode
R113 roundcubemail
Attached
Detach File
Event Timeline