Paket ini dapat mengoptimalkan PNG, JPG, WEBP, AVIF, SVG, dan GIF dengan menjalankannya melalui rangkaian berbagai alat pengoptimalan gambar. Inilah cara Anda dapat menggunakannya:
gunakan SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Gambar di $pathToImage
akan ditimpa oleh versi yang dioptimalkan yang seharusnya lebih kecil. Paket ini akan secara otomatis mendeteksi biner pengoptimalan mana yang diinstal pada sistem Anda dan menggunakannya.
Berikut beberapa contoh konversi yang telah dilakukan oleh paket ini.
Mencintai Laravel? Kemudian pergilah ke integrasi khusus Laravel.
Menggunakan WordPress? Kemudian coba perintah WP CLI.
Penggemar SilverStripe? Jangan buang waktu, buka modul SilverStripe.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui composer:
komposer memerlukan spatie/pengoptimal gambar
Paket ini akan menggunakan pengoptimal berikut jika ada di sistem Anda:
JPEGOptim
Memilih
pngkuantitas 2
SVGO 1
GIF
cwebp
avifenc
Berikut cara menginstal semua pengoptimal di Ubuntu/Debian:
sudo apt-get install jpegoptim sudo apt-get install optipng sudo apt-get install pngquant sudo npm install -g svgo sudo apt-get install gifsicle sudo apt-get install webp sudo apt-get install libavif-bin # minimum 0.9.3
Dan berikut cara install binari di MacOS (menggunakan Homebrew):
buatan instal jpegoptim pembuatan bir optng pembuatan bir instal pngquant npm instal -g svgo pembuatan bir instal gifsicle pembuatan bir instal webp buatan instal libavif
Dan berikut cara menginstal binari di Fedora/RHEL/CentOS:
sudo dnf install epel-rilis sudo dnf instal jpegoptim sudo dnf install optipng sudo dnf instal pngquant sudo npm install -g svgo sudo dnf instal gifsicle sudo dnf instal libwebp-tools sudo dnf instal libavif-tools
Paket ini secara otomatis akan memutuskan alat mana yang akan digunakan pada gambar tertentu.
JPG akan dibuat lebih kecil dengan menjalankannya melalui JpegOptim. Opsi berikut digunakan:
-m85
: ini akan menyimpan gambar dengan kualitas 85%. Pengaturan ini tampaknya memenuhi aturan kompresi Pagespeed Google
--strip-all
: ini menghapus semua informasi teks seperti komentar dan data EXIF
--all-progressive
: ini akan memastikan gambar yang dihasilkan adalah gambar progresif, artinya gambar dapat diunduh menggunakan beberapa lintasan dengan detail yang semakin tinggi.
PNG akan dibuat lebih kecil dengan menjalankannya melalui dua alat. Yang pertama adalah PNGquant 2, kompresor PNG lossy. Kami tidak menetapkan opsi tambahan, defaultnya digunakan. Setelah itu kita jalankan gambarnya melalui yang kedua: Optipng. Opsi berikut digunakan:
-i0
: ini akan menghasilkan gambar pindaian progresif yang tidak bertautan
-o2
: ini mengatur tingkat optimasi menjadi dua (beberapa uji kompresi IDAT)
SVG akan diperkecil oleh SVGO. Konfigurasi default SVGO akan digunakan, dengan penghilangan plugin cleanupIDs
dan removeViewBox
karena diketahui menyebabkan masalah saat menampilkan beberapa SVG yang dioptimalkan pada satu halaman.
Perlu diketahui bahwa SVGO dapat merusak svg. Anda akan menemukan info lebih lanjut tentang hal itu di postingan blog luar biasa oleh Sara Soueidan ini.
GIF akan dioptimalkan oleh Gifsicle. Opsi berikut akan digunakan:
-O3
: ini menyetel tingkat pengoptimalan ke maksimum Gifsicle, yang memberikan hasil paling lambat namun terbaik
WEBP akan dioptimalkan oleh Cwebp. Opsi berikut akan digunakan:
-m 6
untuk metode kompresi paling lambat guna mendapatkan kompresi terbaik.
-pass 10
untuk memaksimalkan jumlah analisis yang lulus.
-mt
multithreading untuk beberapa peningkatan kecepatan.
-q 90
Faktor kualitas yang membawa perubahan paling sedikit.
(Pengaturan asli diambil dari sini)
AVIF akan dioptimalkan oleh avifenc. Opsi berikut akan digunakan:
-a cq-level=23
: Tingkat Kualitas Konstan. Nilai yang lebih rendah berarti kualitas yang lebih baik dan ukuran file yang lebih besar (0-63).
-j all
: Jumlah pekerjaan (utas pekerja, all
menggunakan semua inti yang tersedia).
--min 0
: Pengukur minimum untuk warna (0-63).
--max 63
: Pengukur maks untuk warna (0-63).
--minalpha 0
: Pengukur minimum untuk alfa (0-63).
--maxalpha 63
: Pengukur maks untuk alfa (0-63).
-a end-usage=q
Mode kontrol laju diatur ke mode Kualitas Konstan.
-a tune=ssim
: SSIM sebagai penyetel encoder untuk metrik distorsi.
(Pengaturan asli diambil dari sini dan sini)
Ini adalah cara default untuk menggunakan paket:
gunakan SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Gambar di $pathToImage
akan ditimpa oleh versi yang dioptimalkan yang seharusnya lebih kecil.
Paket ini akan secara otomatis mendeteksi biner pengoptimalan mana yang diinstal pada sistem Anda dan menggunakannya.
Untuk mempertahankan gambar asli, Anda dapat melewati argumen kedua optimize
:
gunakan SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
Dalam contoh tersebut paket tidak akan menyentuh $pathToImage
dan menulis versi yang dioptimalkan ke $pathToOutput
.
Anda dapat mengatur waktu maksimum dalam hitungan detik yang dapat digunakan oleh masing-masing pengoptimal dalam suatu rantai dengan memanggil setTimeout
:
$optimizerChain->setTimeout(10) ->optimalkan($pathToImage);
Dalam contoh ini, setiap pengoptimal dalam rantai akan mendapat waktu maksimal 10 detik untuk melakukan tugasnya.
Jika Anda ingin menyesuaikan rantai pengoptimal, Anda dapat melakukannya dengan menambahkan Optimizer
secara manual ke OptimizerChain
.
Berikut ini contoh di mana kami hanya ingin optipng
dan jpegoptim
digunakan:
gunakan SpatieImageOptimizerOptimizerChain; gunakan SpatieImageOptimizerOptimizersJpegoptim; gunakan SpatieImageOptimizerOptimizersPngquant;$optimizerChain = (OptimizerChain baru) ->addOptimizer(Jpegoptim baru([ '--strip-all', '--all-progressive', ])) ->addOptimizer(Pngquant baru([ '--force', ]))
Perhatikan bahwa Anda dapat meneruskan opsi yang harus digunakan Optimizer
ke konstruktornya.
Ingin menggunakan utilitas baris perintah lain untuk mengoptimalkan gambar Anda? Tidak masalah. Cukup tulis pengoptimal Anda sendiri. Pengoptimal adalah kelas apa pun yang mengimplementasikan antarmuka SpatieImageOptimizerOptimizersOptimizer
:
namespace SpatieImageOptimizerOptimizers; gunakan SpatieImageOptimizerImage; Pengoptimal antarmuka {/** * Mengembalikan nama biner yang akan dieksekusi. * * @return string */public function binerName(): string;/** * Menentukan apakah gambar tertentu dapat ditangani oleh pengoptimal. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Tetapkan jalur ke gambar yang harus dioptimalkan. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Menyetel opsi yang harus digunakan pengoptimal. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Dapatkan perintah yang harus dijalankan. * * @return string */fungsi publik getCommand(): string; }
Jika Anda ingin melihat contoh implementasi, lihatlah pengoptimal yang ada yang dikirimkan bersama paket ini.
Anda dapat dengan mudah menambahkan pengoptimal menggunakan metode addOptimizer
pada OptimizerChain
.
gunakan SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->tambahkanOptimizer(baru YourCustomOptimizer()) ->optimalkan($pathToImage);
Secara default paket tidak akan menimbulkan kesalahan apa pun dan hanya beroperasi secara diam-diam. Untuk memverifikasi apa yang dilakukan paket, Anda dapat menyetel logger:
gunakan SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger(MyLogger baru()) ->optimalkan($pathToImage);
Logger adalah kelas yang mengimplementasikan PsrLogLoggerInterface
. Pustaka logging bagus yang sepenuhnya patuh adalah Monolog. Paket akan menulis untuk mencatat Optimizers
mana yang digunakan, perintah mana yang dijalankan dan keluarannya.
Berikut adalah beberapa contoh konversi kehidupan nyata yang dilakukan oleh paket ini.
Metodologi untuk gambar JPG, WEBP, AVIF: gambar asli telah dimasukkan ke spatie/gambar (menggunakan driver GD default) dan diubah ukurannya menjadi lebar 2048px:
SpatieImageImage::load('asli.jpg') ->lebar(2048) ->simpan('gambar.jpg'); // gambar.png, gambar.webp, gambar.avif
Asli
771 KB
Dioptimalkan
511 KB (-33,7%, DSSIM: 0,00052061)
kredit: Jeff Sheldon, melalui Unsplash
Asli
461 KB
Dioptimalkan
184 KB (-60,0%, DSSIM: 0,00166036)
kredit: Jeff Sheldon, melalui Unsplash
Asli
725 KB
Dioptimalkan
194 KB (-73,2%, DSSIM: 0,00163751)
kredit: Jeff Sheldon, melalui Unsplash
Asli: Photoshop 'Simpan untuk web' | PNG-24 dengan transparansi
39KB
Dioptimalkan
16 KB (-59%, DSSIM: 0,00000251)
Asli: Ilustrator | Ekspor SVG yang dioptimalkan untuk web
25KB
Dioptimalkan
20 KB (-21,5%)
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
tes komposer
Silakan lihat KONTRIBUSI untuk rinciannya.
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Anda bebas menggunakan paket ini (berlisensi MIT), namun jika paket ini masuk ke lingkungan produksi Anda, kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan.
Alamat kami adalah: Spatie, Kruikstraat 22, 2018 Antwerp, Belgia.
Kami mempublikasikan semua kartu pos yang diterima di situs web perusahaan kami.
Freek Van der Herten
Semua Kontributor
Paket ini terinspirasi oleh psliwa/image-optimizer
Dukungan emosional diberikan oleh Joke Forment
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.