Imagick vs Gd

Joseph Gordon-Levitt
Joseph Gordon-Levittasal
2025-02-22 09:26:08895semak imbas

Imagick vs GD

mata utama

    GD dan ImageMagick adalah perpustakaan pemprosesan imej PHP yang popular.
  • Dari segi prestasi, tidak ada kelebihan dan kekurangan mutlak antara kedua -dua, dan kelajuan bergantung kepada senario aplikasi tertentu.
  • Gaya pengekodan adalah penting.
  • Di samping kedua -dua perpustakaan ini, terdapat pilihan lain, seperti platform pemprosesan imej awan atau komponen yang telah diintegrasikan ke dalam aplikasi.

Pengenalan

Dalam aplikasi PHP, jika anda perlu membuat gambar kecil, gunakan penapis imej, atau lakukan penukaran imej lain, anda perlu menggunakan perpustakaan pemprosesan imej. Biasanya, anda akan memilih GD atau ImageMagick. Tetapi perpustakaan mana yang menyokong lebih banyak format imej? Perpustakaan mana yang lebih cepat? Apakah faktor lain yang perlu dipertimbangkan semasa memilih perpustakaan yang betul? Artikel ini akan menjawab soalan -soalan ini!

Ketersediaan

GD dan ImageMagick boleh didapati di PHP, dengan syarat ia dipasang dan dikonfigurasikan dengan PHP sendiri. Perpustakaan GD dimasukkan secara lalai bermula dengan PHP 4.3, jadi ia boleh didapati di kebanyakan persekitaran pelayan. Sebaliknya, Imagemagick tidak selalu tersedia dan beberapa syarikat hosting tidak menawarkannya.

Anda boleh menjalankan beberapa baris kod untuk memeriksa ketersediaan kedua -dua perpustakaan ini. Fungsi ImageMagick

dan GD queryFormats() juga boleh menyenaraikan format imej yang disokong oleh setiap perpustakaan: gd_info()

<code class="language-php">if (extension_loaded('gd')) {
    print_r(gd_info());
} else {
    echo 'GD不可用。';
}

if (extension_loaded('imagick')) {
    $imagick = new Imagick();
    print_r($imagick->queryFormats());
} else {
    echo 'ImageMagick不可用。';
}</code>

Jenis fail yang disokong

Senarai format imej yang disokong dicetak selepas melaksanakan kod di atas terlebih dahulu menunjukkan bahawa fungsi Perpustakaan ImageMagick jauh melebihi GD. GD hanya menyokong fail JPG, PNG, GIF, WBMP, WEBP, XBM dan XPM, dan nombornya sangat terhad berbanding dengan lebih daripada seratus jenis fail yang diproses oleh Perpustakaan ImageMagick.

Anda mungkin fikir anda mungkin tidak pernah menggunakan semua format yang tidak biasa ini yang disokong oleh ImageMagick, tetapi itu mungkin tidak berlaku. Dalam salah satu projek saya, saya terpaksa beralih dari GD ke ImageMagick, semata -mata kerana GD tidak menyokong fail TIFF.

Fungsi

GD dan ImageMagick kedua -duanya menyediakan beberapa fungsi asas, seperti: mengubah saiz dan menanam imej, mencipta imej yang terdiri daripada bentuk tersuai, teks dan fail imej lain, menggunakan penapis imej (mengubah kecerahan, kontras, teduhan, dan lain -lain).

Jika anda ingin memproses imej lebih maju, lihat semua ciri Perpustakaan ImageMagick. Seperti yang ditunjukkan dalam halaman Contoh ImageMagick - yang pertama dan kedua - anda boleh menukar, menghias, atau memutarbelitkan imej dengan banyak cara.

PHP ImageMagick Class sendiri menyediakan 331 kaedah, yang merupakan jumlah yang cukup besar (tidak, saya tidak menghitung secara manual, saya menggunakan

;)). Di satu pihak, ia menunjukkan kuasa Perpustakaan Imagemagick, dan sebaliknya, ia juga menjadikannya sukar untuk mencari dan melaksanakan kaedah yang sesuai untuk kes -kes penggunaan tertentu. ReflectionClass

Prestasi

Sejujurnya, jika anda hanya ingin membuat satu set gambar kecil atau memohon transformasi mudah ke imej, anda tidak perlu mengambil berat tentang membandingkan prestasi setiap perpustakaan pemprosesan imej.

Dalam satu siri ujian yang saya lakukan dengan konfigurasi pelayan biasa, membuat gambar kecil dari imej JPG kamera digital 3MB, ia mengambil masa kira -kira 0.6 saat untuk menggunakan ImageMagick dan kira -kira 0.5 saat untuk menggunakan GD. Jadi, tidak kira perpustakaan yang anda gunakan, keseluruhan proses tidak akan mengambil banyak masa. Selepas melayari web dan mencari ujian kelajuan untuk kedua -dua perpustakaan, anda akan mendapati dengan cepat bahawa mereka tidak dapat menonjol dari segi prestasi. Kadang -kadang perpustakaan GD berjalan lebih cepat, kadang -kadang ia adalah Imagemagick - semuanya terpulang kepada kes penggunaan. Jangan anggap standard ini sebagai faktor utama apabila memutuskan sama ada menggunakan GD atau ImageMagick.

gaya pengekodan

Jika anda membandingkan kod penukaran imej yang sama yang ditulis menggunakan perpustakaan GD dan ImageMagick, anda akan dengan cepat melihat beberapa perbezaan di antara mereka. Perpustakaan GD disediakan melalui satu siri fungsi seperti getimagesize() atau imagecreatetruecolor(), jadi keseluruhan skrip pemprosesan imej perlu ditulis dalam gaya prosedur. Mari kita lihat contoh membuat gambar kecil jpg imej:

<code class="language-php">if (extension_loaded('gd')) {
    print_r(gd_info());
} else {
    echo 'GD不可用。';
}

if (extension_loaded('imagick')) {
    $imagick = new Imagick();
    print_r($imagick->queryFormats());
} else {
    echo 'ImageMagick不可用。';
}</code>

Oleh kerana tiada pengecualian dilemparkan apabila ralat berlaku, semua pengendalian ralat mesti dicapai dengan memeriksa hasil setiap fungsi GD. Anda juga perlu berurusan dengan fungsi besar dengan sepuluh parameter, seperti imagecopyresampled() atau imagecopyresized(). Saya percaya bahawa begitu banyak parameter bukan contoh amalan pengekodan yang baik.

Satu lagi perkara yang mungkin kurang mudah ialah fungsi membaca dan menyimpan imej berbeza -beza bergantung pada jenis imej. Oleh itu, jika anda mahu skrip generasi kecil anda mengendalikan jenis fail yang berbeza, anda perlu menambah kod berikut:

<code class="language-php">$src_img = imagecreatefromjpeg('source.jpg');
if (!$src_img) {
    die('读取源图像时出错。');
}
$thumbnail = imagecreatetruecolor(800, 800);
if (!$thumbnail) {
    die('创建目标图像时出错。');
}
$result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600);
if (!$result) {
    die('生成缩略图时出错。');
}
$result = imagejpeg($thumbnail, 'destination.jpg');
if (!$result) {
    die('保存缩略图时出错。');
}
$result = imagedestroy($thumbnail);
if (!$result) {
    die('销毁图像时出错。');
}</code>

maka anda perlu melaksanakan fungsi yang berbeza mengikut jenis imej untuk menyimpan imej sasaran dalam format yang betul. Seperti yang anda dapat lihat, kod GD dengan cepat akan menjadi rumit.

Cukup periksa kod ImageMagick yang bertanggungjawab untuk operasi yang sama dan anda akan melihat perbezaannya:

<code class="language-php">switch ($image_type) {
    case 'gif':
        $src_img = imagecreatefromgif($path);
        break;
    case 'png':
        $src_img = imagecreatefrompng($path);
        break;
    case 'jpg':
    case 'jpeg':
        $src_img = imagecreatefromjpeg($path);
        break;
    default:
        return false;
        break;
}

//继续创建缩略图</code>

Perpustakaan ImageMagick boleh diakses melalui kelas Imagik. Oleh itu, kita boleh mendapat manfaat daripada semua kelebihan paradigma pengaturcaraan berorientasikan objek. Contoh yang paling mudah adalah bagaimana menangani kesilapan. Apabila menggunakan Perpustakaan ImageMagick, anda hanya membungkus semua kod anda dalam blok percubaan dan aplikasi anda boleh dilaksanakan dengan selamat.

Seperti yang ditunjukkan di atas, skrip ImageMagick yang bertanggungjawab untuk membuat gambar kecil tidak mengandungi sebarang kod yang berkaitan dengan jenis imej sumber. Kod yang sama boleh digunakan untuk memproses imej JPG serta fail PNG atau TIF. Sekiranya anda perlu menukar imej sumber ke jenis lain, tambahkan garis kod sebelum melaksanakan kaedah writeImage():

<code class="language-php">try {
    $imagick = new Imagick();
    $imagick->readImage('source.jpg');
    $imagick->thumbnailImage(800, 800);
    $imagick->writeImage('destination.jpg');
} catch (Exception $e) {
    die('创建缩略图时出错:' . $e->getMessage());
}</code>

Adakah lebih jelas? Pada pendapat saya, menggunakan fungsi perpustakaan GD untuk memproses imej tidak mudah seperti Imagemagick. Sudah tentu, GD mempunyai beberapa pembalut yang tersedia untuk menjadikannya berorientasikan objek, tetapi pada masa ini ia mula berasa seperti penampalan.

Populariti

Oleh kerana perpustakaan GD dimasukkan ke dalam semua versi PHP baru secara lalai, anda mungkin melihat perpustakaan ini lebih kerap dalam pelbagai projek daripada ImageMagick. Apabila projek CakePHP saya memerlukan komponen yang bertanggungjawab untuk mengendalikan muat naik imej dan generasi kecil, saya dengan cepat menemui komponen berdasarkan GD yang sesuai dengan keperluan saya. Anda kadang-kadang boleh menemui beberapa modul yang ditulis dengan baik yang membolehkan anda memilih antara dua perpustakaan pemprosesan imej-seperti Perpustakaan Imej Rangka Kerja Kohana, tetapi saya bimbang bahawa mereka tidak biasa.

Alternatif

Anda tidak perlu berpegang dengan perpustakaan PHP tertentu apabila memutuskan cara memproses pemprosesan imej dalam aplikasi anda. Terdapat penyelesaian lain yang patut dipertimbangkan:

  1. Gunakan skrip pemprosesan imej yang berjalan di luar aplikasi PHP. Dalam salah satu aplikasi saya, saya perlu membuat laman web yang membolehkan pelawat menukar imej dalam talian, betul -betul di tetingkap penyemak imbas. Saya memutuskan untuk menggunakan perpustakaan pemprosesan imej caman.js JavaScript dan ia melakukan pekerjaan yang hebat. Perpustakaan ini juga boleh digunakan sebagai skrip latar belakang yang tertanam dalam platform Node.js, yang semakin meningkat populariti.

  2. Gunakan platform pemprosesan imej berasaskan awan. Penyelesaian berasaskan awan boleh melakukan tugas untuk anda - selepas menghantar fail sumber, anda boleh mendapatkan gambar kecil dari saiz atau imej yang berbeza yang ditukar melalui pelbagai penapis. Anda tidak perlu menulis terlalu banyak kod dan ia tidak terhad oleh keupayaan pelayan. Hanya buka Google dan cari beberapa syarikat yang menawarkan perkhidmatan sedemikian.

  3. Semak fungsi komponen yang anda gunakan. Anda mungkin terkejut mendapati bahawa anda boleh menukar imej anda dengan menggunakan perkhidmatan yang sudah disambungkan ke aplikasi anda. Sebagai contoh, API Dropbox menyediakan kaedah kecil yang membolehkan anda mendapatkan imej JPG atau PNG dalam salah satu daripada lima saiz yang tersedia. Semak dokumentasi untuk perpustakaan dan API anda dan anda mungkin mendapati bahawa mereka boleh melakukan apa yang anda perlukan.

Ringkasan

seperti yang anda lihat, setiap perpustakaan pemprosesan imej mempunyai kelebihan dan kekurangannya. Perpustakaan GD tersedia secara meluas, jadi ia boleh berfungsi di mana -mana sahaja. Oleh kerana ia sangat popular, mudah bagi anda untuk mencari banyak contoh dan komponen yang menggunakan perpustakaan ini. Mendapatkan bantuan juga lebih mudah, kerana lebih banyak orang mungkin biasa dengan perpustakaan GD daripada ImageMagick.

ImageMagick menyokong lebih banyak jenis fail dan boleh menukar imej dengan lebih banyak cara daripada perpustakaan GD. Ia juga membolehkan anda menulis kod kualiti yang lebih jelas dan lebih tinggi.

Akhirnya, terdapat alternatif lain, seperti perkhidmatan pemprosesan imej awan, yang mungkin menghapuskan keperluan untuk kedua -dua perpustakaan. Saya harap artikel ini membantu anda membuat pilihan anda.

Jika anda mempunyai sebarang pertanyaan atau komen mengenai artikel ini, sila hubungi saya di bawah atau hubungi saya melalui Google.

FAQ untuk Imagick dan GD

Apakah perbezaan utama antara Imagick dan GD dari segi fungsi?

Imagick dan GD adalah kedua -dua perpustakaan yang kuat untuk pemprosesan imej dalam PHP. Walau bagaimanapun, mereka berbeza dengan ketara dalam fungsi mereka. Dikenali dengan set ciri yang luas, Imagick menawarkan pelbagai pilihan pemprosesan imej, termasuk ciri -ciri canggih seperti kesan lapisan, penapis imej, dan pelarasan warna. GD, sebaliknya, adalah lebih mudah dan mudah, memberi tumpuan kepada tugas pemprosesan imej asas seperti saiz semula, tanaman, dan keupayaan lukisan mudah. Walaupun GD mungkin cukup untuk mencapai tugas mudah, Imagick sering menjadi pilihan pertama untuk keperluan pemprosesan imej yang lebih kompleks.

Bagaimanakah Imagick dan GD membandingkan dari segi prestasi?

Prestasi mungkin berbeza mengikut persekitaran tugas dan pelayan. Secara umumnya, Imagick dianggap mengambil lebih banyak sumber daripada GD kerana set ciri yang luas. Walau bagaimanapun, ia juga cenderung menghasilkan hasil yang lebih tinggi, terutamanya apabila berurusan dengan tugas pemprosesan imej yang kompleks. GD, sebaliknya, biasanya lebih cepat dan menggunakan sumber yang kurang, menjadikannya pilihan yang baik untuk tugas mudah atau persekitaran dengan sumber yang terhad.

Mana yang lebih baik, Imagick atau GD, lebih baik untuk memproses imej besar?

Imagick biasanya lebih sesuai untuk bekerja dengan imej besar. Ini kerana Imagick menyokong ciri yang dipanggil "cache piksel berasaskan cakera", yang membolehkannya memproses imej yang lebih besar daripada memori yang tersedia. GD, sebaliknya, tidak menyokong ciri ini, jadi anda boleh mengalami kesukaran ketika bekerja dengan imej besar, terutama pada pelayan dengan memori yang terhad.

Bagaimanakah IMAGICK dan GD mengendalikan ketelusan?

kedua -dua Imagick dan GD menyokong ketelusan, tetapi mereka mengendalikan ketelusan sedikit berbeza. Imagick menyokong pelbagai pilihan ketelusan, termasuk saluran alfa dan pelbagai mod hibrid. Sebaliknya, GD mempunyai sokongan yang lebih terhad untuk ketelusan, dan kadang -kadang sukar untuk menangani kesan ketelusan yang kompleks.

Bolehkah saya menggunakan Imagick dan GD dalam projek yang sama?

Ya, Imagick dan GD boleh digunakan serentak dalam projek yang sama. Walau bagaimanapun, adalah penting untuk diperhatikan bahawa kedua -dua perpustakaan ini menggunakan nama sintaks dan fungsi yang berbeza, jadi anda perlu memastikan kod anda serasi dengan kedua -duanya. Di samping itu, menggunakan kedua -dua perpustakaan dalam projek yang sama dapat meningkatkan kerumitan kod dan boleh menyebabkan masalah prestasi, jadi umumnya disyorkan untuk memilih salah satu dari mereka jika mungkin.

Perpustakaan mana yang mempunyai sokongan yang lebih luas: Imagick atau GD?

kedua -dua Imagick dan GD disokong secara meluas dan diselenggarakan secara aktif. Walau bagaimanapun, GD dimasukkan secara lalai dalam kebanyakan pemasangan PHP, menjadikannya lebih banyak tersedia secara universal. Sebaliknya, Imagick biasanya perlu dipasang secara berasingan, yang kadang -kadang boleh menyebabkan masalah keserasian.

Bagaimanakah Imagick dan GD membandingkan dari segi dokumentasi dan sokongan komuniti?

Imagick dan GD mempunyai dokumentasi yang luas dan sokongan komuniti aktif. Walau bagaimanapun, disebabkan oleh sejarahnya yang lebih panjang dan penggunaan yang lebih luas, GD sering mempunyai sumber dan tutorial yang lebih siap sedia dalam talian. Walaupun Imagick mempunyai dokumentasi yang baik, ia mungkin mengambil lebih banyak penggalian untuk mencari penyelesaian atau contoh tertentu.

Adakah terdapat masalah keselamatan dengan Imagick atau GD?

kedua -dua Imagick dan GD dianggap perpustakaan yang selamat. Walau bagaimanapun, seperti mana -mana perisian, mereka juga boleh dieksploitasi jika digunakan secara tidak wajar. Pastikan anda sentiasa menggunakan versi terbaru perpustakaan dan ikuti amalan terbaik untuk pengekodan selamat.

perpustakaan mana yang harus saya pilih untuk projek saya: Imagick atau GD?

Memilih Imagick atau GD bergantung kepada keperluan khusus projek. Jika keupayaan pemprosesan imej lanjutan diperlukan, atau imej besar perlu diproses, Imagick mungkin menjadi pilihan yang lebih baik. Walau bagaimanapun, jika anda bekerja pada projek yang lebih mudah, atau bekerja dalam persekitaran yang terhad sumber, GD mungkin menjadi pilihan yang lebih baik.

Bolehkah saya beralih dari GD ke Imagay Midway melalui projek (dan sebaliknya)?

Walaupun secara teknikal mungkin beralih dari GD ke Imagick Midway melalui projek (dan sebaliknya), ini biasanya tidak disyorkan. Ini kerana kedua -dua perpustakaan menggunakan nama sintaks dan fungsi yang berbeza, jadi penukaran mungkin memerlukan perubahan yang ketara pada kod. Jika anda sedang mempertimbangkan suis, biasanya lebih baik membuat keputusan pada permulaan projek.

Atas ialah kandungan terperinci Imagick vs Gd. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn