Catatan di muka: Di bawah ini jawaban belum selesai dan belum diuji, tetapi saya tidak punya cukup waktu, jadi saya akan meninggalkan ini di sini sebagai konsep. Apa yang mungkin membutuhkan sepasang mata kedua adalah metode kualitas dan interpretasi version_compare()
.
Pertama, kita membutuhkan titik masuk. Setelah membaca posting make lagi, saya pikir yang terbaik adalah melompat sebelum Editor Gambar menyimpan gambar yang baru dibuat. Jadi, inilah pengontrol mikro yang memotong selama panggilan balik yang dikaitkan image_editor_save_pre
dan memuat kelas yang kemudian berjalan melalui pengaturan Anda yang didefinisikan di dalam panggilan balik ke wpse_jpeg_quality
. Ini hanya mengembalikan rasio kompresi yang berbeda untuk jpeg_quality
filter yang berjalan di dalam Image Editor.
<?php
namespace WPSE;
/**
* Plugin Name: (#138751) JPEG Quality Router
* Author: Franz Josef Kaiser
* Author URI: http://unserkaiser.com
* License: CC-BY-SA 2.5
*/
add_filter( 'image_editor_save_pre', 'WPSE\JPEGQualityController', 20, 2 );
/**
* @param string $image
* @param int $post_id
* @return string
*/
function JPEGQualityController( $image, $post_id )
{
$config = apply_filters( 'wpse_jpeg_quality', array(
# Valid: <, lt, <=, le, >, gt, >=, ge, ==, =, eq
'limit' => 'gt',
# Valid: h, w
'reference' => 'w',
'breakpoint' => 50,
'low' => 80,
'high' => 100,
) );
include_once plugin_dir_path( __FILE__ ).'worker.php';
new \WPSE\JPEGQualityWorker( $image, $config );
return $image;
}
Pekerja yang sebenarnya adalah JPEGQualityWorker
kelas. Itu berada di direktori yang sama dengan file plugin utama di atas dan dinamaiworker.php
(atau Anda mengubah controller di atas).
Ini mengambil gambar dan pengaturan Anda dan kemudian menambahkan panggilan balik ke jpeg_quality
filter. Apa yang dilakukan adalah
- mengambil referensi gambar Anda (lebar atau tinggi)
- mempertanyakan breakpoint Anda yang memutuskan di mana harus beralih antara rasio kualitas / kompresi rendah dan tinggi
- mengambil ukuran gambar asli
- memutuskan kualitas apa yang akan kembali
Breakpoint dan batasnya adalah apa yang memutuskan antara tinggi dan rendah dan seperti yang disebutkan di atas ini mungkin memerlukan lebih banyak cinta.
<?php
namespace WPSE;
/**
* Class JPEGQualityWorker
* @package WPSE
*/
class JPEGQualityWorker
{
protected $config, $image;
/**
* @param string $image
* @param array $config
*/
public function __construct( Array $config, $image )
{
$this->config = $config;
$this->image = $image;
add_filter( 'jpeg_quality', array( $this, 'setQuality' ), 20, 2 );
}
/**
* Return the JPEG compression ratio.
*
* Avoids running in multiple context, as WP runs the function multiple
* times per resize/upload/edit task, which leads to over compressed images.
*
* @param int $compression
* @param string $context Context: edit_image/image_resize/wp_crop_image
* @return int
*/
public function setQuality( $compression, $context )
{
if ( in_array( $context, array(
'edit_image',
'wp_crop_image',
) ) )
return 100;
$c = $this->getCompression( $this->config, $this->image );
return ! is_wp_error( $c )
? $c
: 100;
}
/**
* @param array $config
* @param string $image
* @return int|string|\WP_Error
*/
public function getCompression( Array $config, $image )
{
$reference = $this->getReference( $config );
if ( is_wp_error( $reference ) )
return $reference;
$size = $this->getOriginalSize( $image, $reference );
if ( is_wp_error( $size ) )
return $size;
return $this->getQuality( $config, $size );
}
/**
* Returns the quality set for the current image size.
* If
* @param array $config
* @param int $size
*/
protected function getQuality( Array $config, $size )
{
$result = version_compare( $config['breakpoint'], $size );
return (
0 === $result
AND in_array( $config['limit'], array( '>', 'gt', '>=', 'ge', '==', '=', 'eq' ) )
||
1 === $result
AND in_array( $config['limit'], array( '<', 'lt', '<=', 'le', ) )
)
? $config['high']
: $config['low'];
}
/**
* Returns the reference size (width or height).
*
* @param array $config
* @return string|\WP_Error
*/
protected function getReference( Array $config )
{
$r = $config['reference'];
return ! in_array( $r, array( 'w', 'h', ) )
? new \WP_Error(
'wrong-arg',
sprintf( 'Wrong argument for "reference" in %s', __METHOD__ )
)
: $r;
}
/**
* Returns the size of the original image (width or height)
* depending on the reference.
*
* @param string $image
* @param string $reference
* @return int|\WP_Error
*/
protected function getOriginalSize( $image, $reference )
{
$size = 'h' === $reference
? imagesy( $image )
: imagesx( $image );
# @TODO Maybe check is_resource() to see if we got an image
# @TODO Maybe check get_resource_type() for a valid image
# @link http://www.php.net/manual/en/resource.php
return ! $size
? new \WP_Error(
'image-failure',
sprintf( 'Resource failed in %s', get_class( $this ) )
)
: $size;
}
}
WP_Image_Editor
" jauh lebih merupakan solusi daripada apa yang saya tulis.