run();
}
run_simpleimagecompressor();
add_action( 'admin_menu', 'imagecompressor_admin_menu' );
function imagecompressor_admin_menu() {
add_menu_page( __('Compression','simpleimagecompressor'), __('Compression','simpleimagecompressor'), 'edit_posts', 'simpleimagecompressor.php', 'simpleimagecompressor', 'dashicons-format-gallery', 6 );
}
function simpleimagecompressor() {
$display_admin=1;
$message="";
$configfile=dirname(__FILE__)."/config.ini";
// Restauration de toutes les sauvegardes
if(isset($_GET['restoreallbackups']) && $_GET['restoreallbackups']==1) {
$f=wp_upload_dir()['basedir'];
$total_del=0;
?>
'
'.$nbdel." ".__('images restaurées','simpleimagecompressor').'';
}
// Suppresion de toutes les sauvegardes
if(isset($_GET['deleteallbackups']) && $_GET['deleteallbackups']==1) {
$f=wp_upload_dir()['basedir'];
$total_del=0;
?>
'
.
'.$nbdel." ".__('images supprimées','simpleimagecompressor').' ('.FileSizeConvert($totaldel).')';
}
//Comparaison d'images
if(isset($_GET['compare'])) {
$affiche_compa=1;
if(isset($_GET['delete']) && $_GET['delete']==1) {
$affiche_compa=0;
$i=$_GET['compare'];
$i2=dirname($i).'/backup_'.basename($i);
if(file_exists($i2)) {
unlink($i2);
$message='
'.__('Fichier','simpleimagecompressor').' '.$i2.' '.__('supprimé','simpleimagecompressor').'
';
}
else {
$message=''.__('Fichier','simpleimagecompressor').' '.$i2.' '.__('inexistant','simpleimagecompressor').'
';
}
}
if(isset($_GET['restore']) && $_GET['restore']==1) {
$affiche_compa=0;
$i=$_GET['compare'];
$i2=dirname($i).'/backup_'.basename($i);
if(file_exists($i) && file_exists($i2)) {
unlink($i);
copy($i2,$i);
unlink($i2);
$message=''.__('Fichier','simpleimagecompressor').' '.$i.' '.__('restauré','simpleimagecompressor').'
';
}
else {
$message=''.__('Fichier','simpleimagecompressor').' '.$i.' '.__('ou','simpleimagecompressor').' '.$i2.' '.__('inexistant','simpleimagecompressor').'
';
}
}
if($affiche_compa==1) {
$i=$_GET['compare'];
if(file_exists($i)) {
$i2=dirname($i).'/backup_'.basename($i);
$display_admin=0;
$dimensions=getimagesize($i);
$largeur_ecran=$dimensions[0];
$hauteur_ecran=$dimensions[1];
if($largeur_ecran>1024) {
$hauteur_ecran=1024/$largeur_ecran*$hauteur_ecran;
$largeur_ecran=1024;
}
?>
Comparaison de )
'.__('Fichier','simpleimagecompressor').' '.$i.' '.__('inexistant','simpleimagecompressor').'';
}
}
}
// Sauvegarde et chargement Paramètres
if(isset($_GET['factor']) && isset($_GET['maxsize'])) {
unlink($configfile);
$inf=fopen($configfile,"w");
$factor=$_GET['factor'];
$maxsize=$_GET['maxsize'];
$backup=($_GET['backup']=="on");
fputs($inf,$factor.";".$maxsize.";".$backup);
fclose($inf);
}
else {
$inf=fopen($configfile,"r");
if($inf) {
$cont=trim(fread($inf,4096));
$tmp=explode(";",$cont);
$factor=$tmp[0];
$maxsize=$tmp[1];
$backup=$tmp[2];
}
else {
$factor=5;
$maxsize=2560;
$backup=false;
$inf=fopen($configfile,"w");
fputs($inf,$factor.";".$maxsize.";".$backup);
fclose($inf);
}
}
// Lancement compression globale
if(isset($_GET['compressall']) && $_GET['compressall']==1) {
$display_admin=0;
simpleimagecompressor_all($factor,$maxsize,$backup);
}
// Configuration
if($display_admin==1) {
?>
'.$f.' ('.__('Facteur de compression','simpleimagecompressor').': '.$factor.', '.__('taille maximale','simpleimagecompressor').': '.$maxsize.')'; ?>
.
| # | | | | |
'.$dim_fin[0].'x'.$dim_fin[1];
}
$total_fin+=filesize($i);
?>
|
|
|
|
|
:
:
-%
$maxsize || $dimensions[1]>$maxsize) {
$l=$dimensions[0];
$h=$dimensions[1];
if($l>$h) {
$targetl=$maxsize;
$targeth=$maxsize/$l*$h;
}
else {
$targeth=$maxsize;
$targetl=$maxsize/$h*$l;
}
switch($mimetype) {
case "image/jpeg":
$source = imagecreatefromjpeg($i);
break;
case "image/png":
$source = imagecreatefrompng($i);
break;
case "image/gif":
$source = imagecreatefromgif($i);
break;
}
$thumb = imagecreatetruecolor($targetl, $targeth);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $targetl, $targeth, $l, $h);
switch($mimetype) {
case "image/jpeg":
imagejpeg($thumb,$i);
break;
case "image/png":
imagepng($thumb,$i);
break;
case "image/gif":
imagegif($thumb,$i);
break;
}
}
copy($i,$i2);
$comparaison="";
if($backup) {
$i3=dirname($i)."/backup_".basename($i);
copy($i,$i3);
$comparaison=' ..';
}
$setting = array(
'directory' => dirname($i), // directory file compressed output
'file_type' => array( // file format allowed
'image/jpeg',
'image/png',
'image/gif'
)
);
//$ImgCompressor = new ImgCompressor($setting);
$ImgCompressor = new wpcompressor($setting);
switch($mimetype) {
case "image/jpeg":
$result = $ImgCompressor->run($i2, 'jpg', $factor);
break;
case "image/png":
$result = $ImgCompressor->run($i2, 'png', $factor);
break;
case "image/gif":
$result = $ImgCompressor->run($i2, 'gif', $factor);
break;
}
if($taille_init==0) {
$taille_init=$result['data']['original']['size'];
}
$taille_fin=$result['data']['compressed']['size'];
$retour=FileSizeConvert($taille_init).'->'.FileSizeConvert($taille_fin)." -".intval(100-($taille_fin/$taille_init)*100)."%";
$text=''.__('Image déjà optimisée','simpleimagecompressor').'.';
$color="";
if($taille_fin<$taille_init) {
copy($result['data']['compressed']['image'],$i);
$total_init+=$taille_init;
$total_fin+=$taille_fin;
$color=' style="color:green;" ';
$text=$retour.$comparaison;
}
else {
$total_init+=$taille_init;
$total_fin+=$taille_init;
}
unlink($i2);
unlink($result['data']['compressed']['image']);
return ''.$text.'';
}
function FileSizeConvert($bytes) {
$bytes = floatval($bytes);
$arBytes = array(
0 => array(
"UNIT" => "TB",
"VALUE" => pow(1024, 4)
),
1 => array(
"UNIT" => "GB",
"VALUE" => pow(1024, 3)
),
2 => array(
"UNIT" => "MB",
"VALUE" => pow(1024, 2)
),
3 => array(
"UNIT" => "KB",
"VALUE" => 1024
),
4 => array(
"UNIT" => "B",
"VALUE" => 1
),
);
foreach($arBytes as $arItem) {
if($bytes >= $arItem["VALUE"])
{
$result = $bytes / $arItem["VALUE"];
$result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"];
break;
}
}
return $result;
}
// Optimisation au chargement
// define the wp_generate_attachment_metadata callback
function filter_wp_generate_attachment_metadata( $metadata, $attachment_id ) {
$configfile=dirname(__FILE__)."/config.ini";
$inf=fopen($configfile,"r");
$factor=5;
$maxsize=2560;
$backup=false;
if($inf) {
$cont=trim(fread($inf,4096));
$tmp=explode(";",$cont);
$factor=$tmp[0];
$maxsize=$tmp[1];
$backup=$tmp[2];
}
$images=array();
$mainimg=wp_upload_dir()['basedir']."/".$metadata['file'];
optimize_image($mainimg,$factor,$maxsize,$backup);
$dimensions=getimagesize($mainimg);
$metadata['width']=$dimensions[0];
$metadata['height']=$dimensions[1];
foreach($metadata['sizes'] as $key=>$i) {
$img=$metada['file']['path']."/".$i['file'];
optimize_image($img,$factor,$maxsize,$backup);
$dimensions=getimagesize($img);
$metadata['sizes'][$key]['width']=$dimensions[0];
$metadata['sizes'][$key]['height']=$dimensions[1];
}
return $metadata;
};
// add the filter
add_filter( 'wp_generate_attachment_metadata', 'filter_wp_generate_attachment_metadata', 10, 2 );
class wpcompressor {
function __construct($setting) {
$this->setting = $setting;
}
function run($image, $c_type, $level = 0) {
$img_info = getImageSize($image);
$img_name = basename($image);
$img_type = $img_info['mime'];
$img_size = filesize($image);
// result
$result = array();
// cek & ricek
if(in_array($c_type, array('jpeg','jpg','JPG','JPEG','gif','GIF','png','PNG'))) { // jpeg, png, gif only
if(in_array($img_type, $this->setting['file_type'])){
if($level >= 0 && $level <= 9){
$result['status'] = 'success';
$result['data'] = $this->create($image, $img_name, $img_type, $img_size, $c_type, $level);
}else{
$result['status'] = 'error';
$result['message'] = 'Compression level: from 0 (no compression) to 9';
}
}else{
$result['status'] = 'error';
$result['message'] = 'Failed file type';
}
}else{
$result['status'] = 'error';
$result['message'] = 'Failed file type';
}
return $result;
}
private function check_transparent($img) {
$width = imagesx($img); // Get the width of the image
$height = imagesy($img); // Get the height of the image
// We run the image pixel by pixel and as soon as we find a transparent pixel we stop and return true.
for($i = 0; $i < $width; $i++) {
for($j = 0; $j < $height; $j++) {
$rgba = imagecolorat($img, $i, $j);
if(($rgba & 0x7F000000) >> 24) {
return true;
}
}
}
// If we dont find any pixel the function will return false.
return false;
}
private function create($image, $name, $type, $size, $c_type, $level) {
$img_name = time().$name;
$img_output = $this->setting['directory'].'/'.$img_name;
$img_ex = explode('.', $img_output); // get file extension
// create image
if($type == 'image/jpeg'){
$im = imagecreatefromjpeg($image); // create image from jpeg
}else if($type == 'image/gif'){
$im = imagecreatefromgif($image); // create image from gif
}else{
$im = imagecreatefrompng($image); // create image from png (default)
}
// compree image
if(in_array($c_type, array('jpeg','jpg','JPG','JPEG'))){
$img_name = str_replace(end($img_ex), 'jpg', $img_name); // replace file extension
$img_output = str_replace(end($img_ex), 'jpg', $img_output); // replace file extension
if(!empty($level)){
imagejpeg($im, $img_output, 100 - ($level * 10)); // if level = 2 then quality = 80%
}else{
imagejpeg($im, $img_output, 100); // default quality = 100% (no compression)
}
$im_type = 'image/jpeg';
}else if(in_array($c_type, array('gif','GIF'))){
$img_name = str_replace(end($img_ex), 'gif', $img_name); // replace file extension
$img_output = str_replace(end($img_ex), 'gif', $img_output); // replace file extension
if($this->check_transparent($im)) { // Check if image is transparent
imageAlphaBlending($im, true);
imageSaveAlpha($im, true);
imagegif($im, $img_output);
}
else {
imagegif($im, $img_output);
}
$im_type = 'image/gif';
}else if(in_array($c_type, array('png','PNG'))){
$img_name = str_replace(end($img_ex), 'png', $img_name); // replace file extension
$img_output = str_replace(end($img_ex), 'png', $img_output); // replace file extension
if($this->check_transparent($im)) { // Check if image is transparent
imageAlphaBlending($im, true);
imageSaveAlpha($im, true);
imagepng($im, $img_output, $level); // if level = 2 like quality = 80%
}
else {
imagepng($im, $img_output, $level); // default level = 0 (no compression)
}
$im_type = 'image/png';
}
// image destroy
imagedestroy($im);
// output original image & compressed image
$im_size = filesize($img_output);
$data = array(
'original' => array(
'name' => $name,
'image' => $image,
'type' => $type,
'size' => $size
),
'compressed' => array(
'name' => $img_name,
'image' => $img_output,
'type' => $im_type,
'size' => $im_size
)
);
return $data;
}
}