<?php
class
lib_image_imagick
{
private
$image
= null;
private
$type
= null;
public
function
__construct(){}
public
function
__destruct()
{
if
(
$this
->image!==null)
$this
->image->destroy();
}
public
function
open(
$path
)
{
$this
->image =
new
Imagick(
$path
);
if
(
$this
->image)
{
$this
->type =
strtolower
(
$this
->image->getImageFormat());
}
return
$this
->image;
}
public
function
crop(
$x
=0,
$y
=0,
$width
=null,
$height
=null)
{
if
(
$width
==null)
$width
=
$this
->image->getImageWidth()-
$x
;
if
(
$height
==null)
$height
=
$this
->image->getImageHeight()-
$y
;
if
(
$width
<=0 ||
$height
<=0)
return
;
if
(
$this
->type==
'gif'
)
{
$image
=
$this
->image;
$canvas
=
new
Imagick();
$images
=
$image
->coalesceImages();
foreach
(
$images
as
$frame
){
$img
=
new
Imagick();
$img
->readImageBlob(
$frame
);
$img
->cropImage(
$width
,
$height
,
$x
,
$y
);
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
$canvas
->setImagePage(
$width
,
$height
, 0, 0);
}
$image
->destroy();
$this
->image =
$canvas
;
}
else
{
$this
->image->cropImage(
$width
,
$height
,
$x
,
$y
);
}
}
public
function
resize_to(
$width
= 100,
$height
= 100,
$fit
=
'center'
,
$fill_color
=
array
(255,255,255,0) )
{
switch
(
$fit
)
{
case
'force'
:
if
(
$this
->type==
'gif'
)
{
$image
=
$this
->image;
$canvas
=
new
Imagick();
$images
=
$image
->coalesceImages();
foreach
(
$images
as
$frame
){
$img
=
new
Imagick();
$img
->readImageBlob(
$frame
);
$img
->thumbnailImage(
$width
,
$height
, false );
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
}
$image
->destroy();
$this
->image =
$canvas
;
}
else
{
$this
->image->thumbnailImage(
$width
,
$height
, false );
}
break
;
case
'scale'
:
if
(
$this
->type==
'gif'
)
{
$image
=
$this
->image;
$images
=
$image
->coalesceImages();
$canvas
=
new
Imagick();
foreach
(
$images
as
$frame
){
$img
=
new
Imagick();
$img
->readImageBlob(
$frame
);
$img
->thumbnailImage(
$width
,
$height
, true );
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
}
$image
->destroy();
$this
->image =
$canvas
;
}
else
{
$this
->image->thumbnailImage(
$width
,
$height
, true );
}
break
;
case
'scale_fill'
:
$size
=
$this
->image->getImagePage();
$src_width
=
$size
[
'width'
];
$src_height
=
$size
[
'height'
];
$x
= 0;
$y
= 0;
$dst_width
=
$width
;
$dst_height
=
$height
;
if
(
$src_width
*
$height
>
$src_height
*
$width
)
{
$dst_height
=
intval
(
$width
*
$src_height
/
$src_width
);
$y
=
intval
( (
$height
-
$dst_height
)/2 );
}
else
{
$dst_width
=
intval
(
$height
*
$src_width
/
$src_height
);
$x
=
intval
( (
$width
-
$dst_width
)/2 );
}
$image
=
$this
->image;
$canvas
=
new
Imagick();
$color
=
'rgba('
.
$fill_color
[0].
','
.
$fill_color
[1].
','
.
$fill_color
[2].
','
.
$fill_color
[3].
')'
;
if
(
$this
->type==
'gif'
)
{
$images
=
$image
->coalesceImages();
foreach
(
$images
as
$frame
)
{
$frame
->thumbnailImage(
$width
,
$height
, true );
$draw
=
new
ImagickDraw();
$draw
->composite(
$frame
->getImageCompose(),
$x
,
$y
,
$dst_width
,
$dst_height
,
$frame
);
$img
=
new
Imagick();
$img
->newImage(
$width
,
$height
,
$color
,
'gif'
);
$img
->drawImage(
$draw
);
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
$canvas
->setImagePage(
$width
,
$height
, 0, 0);
}
}
else
{
$image
->thumbnailImage(
$width
,
$height
, true );
$draw
=
new
ImagickDraw();
$draw
->composite(
$image
->getImageCompose(),
$x
,
$y
,
$dst_width
,
$dst_height
,
$image
);
$canvas
->newImage(
$width
,
$height
,
$color
,
$this
->get_type() );
$canvas
->drawImage(
$draw
);
$canvas
->setImagePage(
$width
,
$height
, 0, 0);
}
$image
->destroy();
$this
->image =
$canvas
;
break
;
default
:
$size
=
$this
->image->getImagePage();
$src_width
=
$size
[
'width'
];
$src_height
=
$size
[
'height'
];
$crop_x
= 0;
$crop_y
= 0;
$crop_w
=
$src_width
;
$crop_h
=
$src_height
;
if
(
$src_width
*
$height
>
$src_height
*
$width
)
{
$crop_w
=
intval
(
$src_height
*
$width
/
$height
);
}
else
{
$crop_h
=
intval
(
$src_width
*
$height
/
$width
);
}
switch
(
$fit
)
{
case
'north_west'
:
$crop_x
= 0;
$crop_y
= 0;
break
;
case
'north'
:
$crop_x
=
intval
( (
$src_width
-
$crop_w
)/2 );
$crop_y
= 0;
break
;
case
'north_east'
:
$crop_x
=
$src_width
-
$crop_w
;
$crop_y
= 0;
break
;
case
'west'
:
$crop_x
= 0;
$crop_y
=
intval
( (
$src_height
-
$crop_h
)/2 );
break
;
case
'center'
:
$crop_x
=
intval
( (
$src_width
-
$crop_w
)/2 );
$crop_y
=
intval
( (
$src_height
-
$crop_h
)/2 );
break
;
case
'east'
:
$crop_x
=
$src_width
-
$crop_w
;
$crop_y
=
intval
( (
$src_height
-
$crop_h
)/2 );
break
;
case
'south_west'
:
$crop_x
= 0;
$crop_y
=
$src_height
-
$crop_h
;
break
;
case
'south'
:
$crop_x
=
intval
( (
$src_width
-
$crop_w
)/2 );
$crop_y
=
$src_height
-
$crop_h
;
break
;
case
'south_east'
:
$crop_x
=
$src_width
-
$crop_w
;
$crop_y
=
$src_height
-
$crop_h
;
break
;
default
:
$crop_x
=
intval
( (
请发表评论