No need for ImageMagick to detected animated GIF
This commit is contained in:
parent
3f65bf45ab
commit
2a7d45c986
@ -384,6 +384,12 @@ class File extends Managed_DataObject
|
|||||||
*/
|
*/
|
||||||
public function getThumbnail($width=null, $height=null, $crop=false)
|
public function getThumbnail($width=null, $height=null, $crop=false)
|
||||||
{
|
{
|
||||||
|
// Get some more information about this file through our ImageFile class
|
||||||
|
$image = ImageFile::fromFileObject($this);
|
||||||
|
if ($image->animated && !common_config('image', 'resize_animated')) {
|
||||||
|
throw new UseFileAsThumbnailException($this->id);
|
||||||
|
}
|
||||||
|
|
||||||
if ($width === null) {
|
if ($width === null) {
|
||||||
$width = common_config('thumbnail', 'width');
|
$width = common_config('thumbnail', 'width');
|
||||||
$height = common_config('thumbnail', 'height');
|
$height = common_config('thumbnail', 'height');
|
||||||
@ -398,7 +404,6 @@ class File extends Managed_DataObject
|
|||||||
// Get proper aspect ratio width and height before lookup
|
// Get proper aspect ratio width and height before lookup
|
||||||
// We have to do it through an ImageFile object because of orientation etc.
|
// We have to do it through an ImageFile object because of orientation etc.
|
||||||
// Only other solution would've been to rotate + rewrite uploaded files.
|
// Only other solution would've been to rotate + rewrite uploaded files.
|
||||||
$image = ImageFile::fromFileObject($this);
|
|
||||||
list($width, $height, $x, $y, $w, $h) =
|
list($width, $height, $x, $y, $w, $h) =
|
||||||
$image->scaleToFit($width, $height, $crop);
|
$image->scaleToFit($width, $height, $crop);
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ class ImageFile
|
|||||||
var $height;
|
var $height;
|
||||||
var $width;
|
var $width;
|
||||||
var $rotate=0; // degrees to rotate for properly oriented image (extrapolated from EXIF etc.)
|
var $rotate=0; // degrees to rotate for properly oriented image (extrapolated from EXIF etc.)
|
||||||
var $animated = false; // Animated image? (has more than 1 frame)
|
var $animated = null; // Animated image? (has more than 1 frame). null means untested
|
||||||
|
|
||||||
function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null)
|
function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null)
|
||||||
{
|
{
|
||||||
@ -98,6 +98,8 @@ class ImageFile
|
|||||||
}
|
}
|
||||||
// If we ever write this back, Orientation should be set to '1'
|
// If we ever write this back, Orientation should be set to '1'
|
||||||
}
|
}
|
||||||
|
} elseif ($this->type === IMAGETYPE_GIF) {
|
||||||
|
$this->animated = $this->isAnimatedGif();
|
||||||
}
|
}
|
||||||
|
|
||||||
Event::handle('FillImageFileMetadata', array($this));
|
Event::handle('FillImageFileMetadata', array($this));
|
||||||
@ -500,6 +502,41 @@ class ImageFile
|
|||||||
is_null($cw) ? $width : intval($cw),
|
is_null($cw) ? $width : intval($cw),
|
||||||
is_null($ch) ? $height : intval($ch));
|
is_null($ch) ? $height : intval($ch));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Animated GIF test, courtesy of frank at huddler dot com et al:
|
||||||
|
* http://php.net/manual/en/function.imagecreatefromgif.php#104473
|
||||||
|
* Modified so avoid landing inside of a header (and thus not matching our regexp).
|
||||||
|
*/
|
||||||
|
protected function isAnimatedGif()
|
||||||
|
{
|
||||||
|
if (!($fh = @fopen($this->filepath, 'rb'))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = 0;
|
||||||
|
//an animated gif contains multiple "frames", with each frame having a
|
||||||
|
//header made up of:
|
||||||
|
// * a static 4-byte sequence (\x00\x21\xF9\x04)
|
||||||
|
// * 4 variable bytes
|
||||||
|
// * a static 2-byte sequence (\x00\x2C)
|
||||||
|
// In total the header is maximum 10 bytes.
|
||||||
|
|
||||||
|
// We read through the file til we reach the end of the file, or we've found
|
||||||
|
// at least 2 frame headers
|
||||||
|
while(!feof($fh) && $count < 2) {
|
||||||
|
$chunk = fread($fh, 1024 * 100); //read 100kb at a time
|
||||||
|
$count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches);
|
||||||
|
// rewind in case we ended up in the middle of the header, but avoid
|
||||||
|
// infinite loop (i.e. don't rewind if we're already in the end).
|
||||||
|
if (!feof($fh) && ftell($fh) >= 9) {
|
||||||
|
fseek($fh, -9, SEEK_CUR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fh);
|
||||||
|
return $count > 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//PHP doesn't (as of 2/24/2010) have an imagecreatefrombmp so conditionally define one
|
//PHP doesn't (as of 2/24/2010) have an imagecreatefrombmp so conditionally define one
|
||||||
|
@ -65,12 +65,10 @@ class ImageMagickPlugin extends Plugin
|
|||||||
* @param array $info The response from getimagesize()
|
* @param array $info The response from getimagesize()
|
||||||
*/
|
*/
|
||||||
public function onFillImageFileMetadata(ImageFile $imagefile) {
|
public function onFillImageFileMetadata(ImageFile $imagefile) {
|
||||||
switch ($imagefile->type) {
|
if (is_null($imagefile->animated) && $imagefile->type === IMAGETYPE_GIF) {
|
||||||
case IMAGETYPE_GIF:
|
|
||||||
$magick = new Imagick($imagefile->filepath);
|
$magick = new Imagick($imagefile->filepath);
|
||||||
$magick = $magick->coalesceImages();
|
$magick = $magick->coalesceImages();
|
||||||
$imagefile->animated = $magick->getNumberImages()>1;
|
$imagefile->animated = $magick->getNumberImages()>1;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user