<?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
( (
$src_width
-
$crop_w
)/2 );
$crop_y
=
intval
( (
$src_height
-
$crop_h
)/2 );
}
$image
=
$this
->image;
$canvas
=
new
Imagick();
if
(
$this
->type==
'gif'
)
{
$images
=
$image
->coalesceImages();
foreach
(
$images
as
$frame
){
$img
=
new
Imagick();
$img
->readImageBlob(
$frame
);
$img
->cropImage(
$crop_w
,
$crop_h
,
$crop_x
,
$crop_y
);
$img
->thumbnailImage(
$width
,
$height
, true );
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
$canvas
->setImagePage(
$width
,
$height
, 0, 0);
}
}
else
{
$image
->cropImage(
$crop_w
,
$crop_h
,
$crop_x
,
$crop_y
);
$image
->thumbnailImage(
$width
,
$height
, true );
$canvas
->addImage(
$image
);
$canvas
->setImagePage(
$width
,
$height
, 0, 0);
}
$image
->destroy();
$this
->image =
$canvas
;
}
}
public
function
add_watermark(
$path
,
$x
= 0,
$y
= 0)
{
$watermark
=
new
Imagick(
$path
);
$draw
=
new
ImagickDraw();
$draw
->composite(
$watermark
->getImageCompose(),
$x
,
$y
,
$watermark
->getImageWidth(),
$watermark
->getimageheight(),
$watermark
);
if
(
$this
->type==
'gif'
)
{
$image
=
$this
->image;
$canvas
=
new
Imagick();
$images
=
$image
->coalesceImages();
foreach
(
$image
as
$frame
)
{
$img
=
new
Imagick();
$img
->readImageBlob(
$frame
);
$img
->drawImage(
$draw
);
$canvas
->addImage(
$img
);
$canvas
->setImageDelay(
$img
->getImageDelay() );
}
$image
->destroy();
$this
->image =
$canvas
;
}
else
{
$this
->image->drawImage(
$draw
);
}
}
public
function
add_text(
$text
,
$x
= 0 ,
$y
= 0,
$angle
=0,
$style
=
array
())
{
$draw
=
new
ImagickDraw();
if
(isset(
$style
[
'font'
]))
$draw
->setFont(
$style
[
'font'
]);
if
(isset(
$style
[
'font_size'
]))
$draw
->setFontSize(
$style
[
'font_size'
]);
if
(isset(
$style
[
'fill_color'
]))
$draw
->setFillColor(
$style
[
'fill_color'
]);
if
(isset(
$style
[
'under_color'
]))
$draw
->setTextUnderColor(
$style
[
'under_color'
]);
if
(
$this
->type==
'gif'
)
{
foreach
(
$this
->image
as
$frame
)
{
$frame
->annotateImage(
$draw
,
$x
,
$y
,
$angle
,
$text
);
}
}
else
{
$this
->image->annotateImage(
$draw
,
$x
,
$y
,
$angle
,
$text
);
}
}
public
function
save_to(
$path
)
{
if
(
$this
->type==
'gif'
)
{
$this
->image->writeImages(
$path
, true);
}
else
{
$this
->image->writeImage(
$path
);
}
}
public
function
output(
$header
= true)
{
if
(
$header
) header(
'Content-type: '
.
$this
->type);
echo
$this
->image->getImagesBlob();
}
public
function
get_width()
{
$size
=
$this
->image->getImagePage();
return
$size
[
'width'
];
}
public
function
get_height()
{
$size
=
$this
->image->getImagePage();
return
$size
[
'height'
];
}
public
function
set_type(
$type
=
'png'
)
{
$this
->type =
$type
;
$this
->image->setImageFormat(
$type
);
}
public
function
get_type()
{
return
$this
->type;
}
public
function
is_image()
{
if
(
$this
->image )
return
true;
else
return
false;
}
public
function
thumbnail(
$width
= 100,
$height
= 100,
$fit
= true){
$this
->image->thumbnailImage(
$width
,
$height
,
$fit
);}
public
function
border(
$width
,
$height
,
$color
=
'rgb(220, 220, 220)'
)
{
$color
=
new
ImagickPixel();
$color
->setColor(
$color
);
$this
->image->borderImage(
$color
,
$width
,
$height
);
}
public
function
blur(
$radius
,
$sigma
){
$this
->image->blurImage(
$radius
,
$sigma
);}
public
function
gaussian_blur(
$radius
,
$sigma
){
$this
->image->gaussianBlurImage(
$radius
,
$sigma
);}
public
function
motion_blur(
$radius
,
$sigma
,
$angle
){
$this
->image->motionBlurImage(
$radius
,
$sigma
,
$angle
);}
public
function
radial_blur(
$radius
){
$this
->image->radialBlurImage(
$radius
);}
public
function
add_noise(
$type
=null){
$this
->image->addNoiseImage(
$type
==null?imagick::NOISE_IMPULSE:
$type
);}
public
function
level(
$black_point
,
$gamma
,
$white_point
){
$this
->image->levelImage(
$black_point
,
$gamma
,
$white_point
);}
public
function
modulate(
$brightness
,
$saturation
,
$hue
){
$this
->image->modulateImage(
$brightness
,
$saturation
,
$hue
);}
public
function
charcoal(
$radius
,
$sigma
){
$this
->image->charcoalImage(
$radius
,
$sigma
);}
public
function
oil_paint(
$radius
){
$this
->image->oilPaintImage(
$radius
);}
public
function
flop(){
$this
->image->flopImage();}
public
function
flip(){
$this
->image->flipImage();}
}