Apakah mungkin untuk mengatur kualitas gambar berdasarkan ukuran gambar? Saya ingin memiliki kualitas gambar yang lebih baik untuk gambar yang lebih besar (80) - dan lebih buruk untuk thumbnail kecil (30).
Saya mengharapkan parameter di add_sizeuntuk mengendalikan itu - tetapi tidak ada.
Satu-satunya waktu pengaturan kualitas yang benar-benar penting adalah tepat sebelum gambar disimpan atau dialirkan (untuk editor). Kedua hal ini memiliki filter "image_editor_save_pre" di sana, lewat contoh dari editor gambar. Jadi Anda dapat menggunakannya untuk memodifikasi gambar dengan cara apa pun yang Anda suka, termasuk mengatur kualitasnya.
Jadi, sesuatu seperti ini harus melakukan pekerjaan dengan sederhana dan mudah:
add_filter('image_editor_save_pre','example_adjust_quality');function example_adjust_quality($image){
$size = $image->get_size();// Values are $size['width'] and $size['height']. Based on those, do what you like. Example:if( $size['width']<=100){
$image->set_quality(30);}if( $size['width']>100&& $size['width']<=300){
$image->set_quality(70);}if( $size['width']>300){
$image->set_quality(80);}return $image;}
Alasan mengapa saya tidak menggunakan sesuatu yang lurus seperti ini (+1) adalah, yang saya ingat secara samar bahwa ketika mengedit beberapa gambar (memutar, memotong, dll.), Setiap tindakan dipanggil dua kali, mengurangi kualitas dua kali. Tetap saja bagian "adalah contoh WP_Image_Editor" jauh lebih merupakan solusi daripada apa yang saya tulis.
kaiser
1
Kualitasnya adalah nilai yang pasti, bukan persentase. Anda dapat mengatur dan mengatur ulang semua yang Anda suka, sampai menghemat. Menyetelnya menjadi 100 kali lipat membuatnya jam 10.
Otto
Saya berasumsi itu akan menghemat di antara keduanya. Terimakasih atas peringatannya.
kaiser
Sepertinya saya yang image_editor_save_pretidak dipanggil. Ketika saya mencoba untuk mengeluarkan barang menggunakan error_log(yang pasti berfungsi) saya tidak mendapatkan keluaran apa pun. : /
Nils Riedemann
1
Regenerasi mungkin juga berfungsi, jika itu menampilkan gambar. Tidak ada kode yang akan mengubah file yang ada di sistem tanpa Anda benar-benar mengambil tindakan untuk memuat ulang dan menyimpannya kembali.
Otto
5
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_predan 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_qualityfilter yang berjalan di dalam Image Editor.
Pekerja yang sebenarnya adalah JPEGQualityWorkerkelas. 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_qualityfilter. 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
*/classJPEGQualityWorker{protected $config, $image;/**
* @param string $image
* @param array $config
*/publicfunction __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
*/publicfunction setQuality( $compression, $context ){if( in_array( $context, array('edit_image','wp_crop_image',)))return100;
$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
*/publicfunction 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
*/protectedfunction 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
*/protectedfunction 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
*/protectedfunction 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.phpreturn! $size
?new \WP_Error('image-failure',
sprintf('Resource failed in %s', get_class( $this ))): $size;}}
Masih mengerjakannya? Sejauh yang saya ketahui saya ingin melihatnya sebagai plugin.
Nils Riedemann
Maaf, tapi tidak, saya tidak. Saya ingin melihatnya sebagai plugin juga, tetapi karena saya saat ini tidak membutuhkannya dan tidak punya waktu, itu tidak akan terjadi sejauh ini. Mungkin mencobanya, lihat seberapa jauh Anda mendapatkan dan mengajukan suntingan atau jawaban terpisah? :)
kaiser
kaiser: Saya rasa terlalu rumit. $ Image yang dikirim ke image_editor_save_pre adalah turunan dari kelas WP_Image_Editor. Ini memiliki fungsi untuk mendapatkan ukuran dan mengatur kualitas dan semua yang sudah ada di dalamnya. Yang harus Anda lakukan adalah memanggil mereka.
WP_Image_Editor
" jauh lebih merupakan solusi daripada apa yang saya tulis.image_editor_save_pre
tidak dipanggil. Ketika saya mencoba untuk mengeluarkan barang menggunakanerror_log
(yang pasti berfungsi) saya tidak mendapatkan keluaran apa pun. : /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 kewpse_jpeg_quality
. Ini hanya mengembalikan rasio kompresi yang berbeda untukjpeg_quality
filter yang berjalan di dalam Image Editor.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 adalahBreakpoint dan batasnya adalah apa yang memutuskan antara tinggi dan rendah dan seperti yang disebutkan di atas ini mungkin memerlukan lebih banyak cinta.
sumber