Pourquoi ? Tout simplement parce que la qualité des images JPG compressées par le code PHP de WordPress est horrible… Artefacts de compression, perte de contraste… je vous laisse juge :

WordPress par defaut Avec Imagick


Prérequis :
ImageMagick doit être installé sur le serveur d’hébergement. Pour la partie qui nous intéresse, WordPress étant écrit en PHP, le module PERL Imagick pour PHP est installé (http://pecl.php.net/package/imagick).

Comment : Dans le fichier wp-include/media.php, rechercher la fonction image_resize, la remplacer par la suivante :

333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
function image_resize( $file, $max_w, $max_h, $crop=false, $suffix=null, $dest_path=null, $jpeg_quality=90) {
 
	$image = wp_load_image( $file );
	if ( !is_resource( $image ) )
		return new WP_Error('error_loading_image', $image);
 
	list($orig_w, $orig_h, $orig_type) = getimagesize( $file );
	$dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop);
	if (!$dims)
		return $dims;
	list($dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) = $dims;
 
	$newimage = imagecreatetruecolor( $dst_w, $dst_h);
 
	// preserve PNG transparency
	if ( IMAGETYPE_PNG == $orig_type && function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {
		imagealphablending( $newimage, false);
		imagesavealpha( $newimage, true);
	}
 
	imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
 
	// we don't need the original in memory anymore
	imagedestroy( $image );
 
	// $suffix will be appended to the destination filename, just before the extension
	if ( !$suffix )
		$suffix = "{$dst_w}x{$dst_h}";
 
	$info = pathinfo($file);
	$dir = $info['dirname'];
	$ext = $info['extension'];
	$name = basename($file, ".{$ext}");
	if ( !is_null($dest_path) and $_dest_path = realpath($dest_path) )
		$dir = $_dest_path;
	$destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";
 
	if ( $orig_type == IMAGETYPE_GIF ) {
		if (!imagegif( $newimage, $destfilename ) )
			return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
	}
	elseif ( $orig_type == IMAGETYPE_PNG ) {
		if (!imagepng( $newimage, $destfilename ) )
			return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
	}
	else {
		// all other formats are converted to jpg
		$destfilename = "{$dir}/{$name}-{$suffix}.jpg";
		$ressource = new Imagick($file);
		$ressource->cropImage  ( $src_w, $src_h , $src_x, $src_y  );
		$ressource->thumbnailImage($dst_w, $dst_h);
		$ressource->setCompressionQuality(90);
		$ressource->setImageFormat("jpg");
		$ressource->writeImage($destfilename);
	}
 
	imagedestroy( $newimage );
 
	// Set correct file permissions
	$stat = stat( dirname( $destfilename ));
	$perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
	@ chmod( $destfilename, $perms );
 
	return $destfilename;
}
Commentaire sur “Utiliser ImageMagick dans WordPress” :