Imagick vs GD

Joseph Gordon-Levitt
Joseph Gordon-Levittoriginal
2025-02-22 09:26:08901parcourir

Imagick vs GD

Points clés

  • GD et ImageMagick sont tous deux des bibliothèques de traitement d'image PHP populaires.
  • En termes de performances, il n'y a pas d'avantages et d'inconvénients absolus entre les deux, et la vitesse dépend du scénario d'application spécifique.
  • Les styles de codage sont significatifs.
  • En plus de ces deux bibliothèques, il existe d'autres options, telles que les plates-formes de traitement d'image cloud ou les composants qui ont été intégrés dans l'application.

Introduction

Dans les applications PHP, si vous avez besoin de créer des vignettes, d'appliquer des filtres d'image ou d'effectuer d'autres conversions d'image, vous devez utiliser la bibliothèque de traitement d'image. Habituellement, vous choisissez GD ou ImageMagick. Mais quelle bibliothèque prend en charge plus de formats d'image? Quelle bibliothèque est plus rapide? Quels autres facteurs doivent être pris en compte lors du choix de la bonne bibliothèque? Cet article répondra à ces questions!

Disponibilité

GD et ImageMagick sont disponibles en PHP, à condition qu'ils soient installés et configurés avec PHP lui-même. La bibliothèque GD est incluse par défaut à partir de PHP 4.3, il est donc disponible dans la plupart des environnements de serveur. ImageMagick, en revanche, n'est pas toujours disponible et certaines sociétés d'hébergement ne l'offrent pas.

Vous pouvez exécuter quelques lignes de code pour vérifier la disponibilité de ces deux bibliothèques. Les fonctions queryFormats() et GD de l'imageMagick peuvent également énumérer les formats d'image pris en charge par chaque bibliothèque: 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>

Types de fichiers pris en charge

La liste de format d'image prise en charge imprimée après l'exécution du code ci-dessus montre d'abord que les fonctions de la bibliothèque ImageMagick sont bien au-delà de GD. GD ne prend en charge que les fichiers JPG, PNG, GIF, WBMP, WebP, XBM et XPM, et le nombre est très limité par rapport aux plus d'une centaine de types de fichiers traités par la bibliothèque ImageMagick.

Vous pourriez penser que vous pourriez ne jamais utiliser tous ces formats peu communs soutenus par ImageMagick, mais ce n'est peut-être pas le cas. Dans l'un de mes projets, j'ai dû passer de GD à ImageMagick, simplement parce que GD ne prend pas en charge les fichiers TIFF.

Fonction

GD et ImageMagick offrent tous deux quelques fonctions de base, telles que: redimensionner et recadrer des images, créer des images composées de formes personnalisées, de texte et d'autres fichiers d'image, d'appliquer des filtres d'image (modification de la luminosité, du contraste, de l'ombrage, etc.).

Si vous souhaitez traiter les images plus avancées, consultez toutes les fonctionnalités de la bibliothèque ImageMagick. Comme le montre la page Exemple ImageMagick - la première et la deuxième - vous pouvez convertir, décorer ou déformer des images d'innombrables manières.

La classe PHP ImageMagick elle-même fournit 331 méthodes, ce qui est un nombre assez considérable (non, je n'ai pas compté manuellement, j'ai utilisé

;)). D'une part, il montre la puissance de la bibliothèque ImageMagick, et d'autre part, il rend également difficile la recherche et la mise en œuvre de méthodes appropriées pour des cas d'utilisation spécifiques. ReflectionClass

Performance

Pour être honnête, si vous voulez simplement créer un ensemble de vignettes ou appliquer une transformation simple à l'image, vous n'avez pas à vous soucier de comparer les performances de chaque bibliothèque de traitement d'image.

Dans une série de tests que j'ai fait avec des configurations de serveur typiques, créant des miniatures à partir d'une image JPG de l'appareil photo numérique de 3 Mo, il faut environ 0,6 seconde pour utiliser ImageMagick et environ 0,5 seconde pour utiliser GD. Ainsi, quelle que soit la bibliothèque que vous utilisez, l'ensemble du processus ne prendra pas beaucoup de temps. Après avoir parcouru le Web et trouvé des tests de vitesse pour les deux bibliothèques, vous remarquerez rapidement qu'aucun d'eux ne se démarque en termes de performances. Parfois, la bibliothèque GD s'exécute plus rapidement, parfois c'est ImageMagick - tout dépend du cas d'utilisation. Ne considérez pas cette norme comme un facteur clé lorsque vous décidez d'utiliser GD ou ImageMagick.

Style de codage

Si vous comparez le même code de conversion d'image écrit à l'aide des bibliothèques GD et ImageMagick, vous remarquerez rapidement quelques différences entre elles. La bibliothèque GD est fournie à travers une série de fonctions telles que getimagesize() ou imagecreatetruecolor(), de sorte que l'ensemble du script de traitement d'image doit être écrit dans un style de procédure. Regardons un exemple de création d'une vignette d'image JPG:

<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>

Étant donné qu'aucune exception n'est exercée lorsqu'une erreur se produit, toutes les erreurs doivent être obtenues en vérifiant les résultats de chaque fonction GD. Vous devez également faire face à d'énormes fonctions avec dix paramètres, tels que imagecopyresampled() ou imagecopyresized(). Je crois que tant de paramètres ne sont pas un exemple de bonnes pratiques de codage.

Une autre chose qui peut être moins pratique est que les fonctions de lecture et de sauvegarde des images varient en fonction du type d'image. Par conséquent, si vous souhaitez que votre script de génération de miniatures gère différents types de fichiers, vous devez ajouter le code suivant:

<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>

Ensuite, vous devez exécuter différentes fonctions en fonction du type d'image pour enregistrer l'image cible dans le format correct. Comme vous pouvez le voir, le code GD deviendra rapidement compliqué.

Vérifiez simplement le code ImageMagick responsable de la même opération et vous remarquerez la différence:

<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>

La bibliothèque ImageMagick est accessible via la classe Imagrick. Par conséquent, nous pouvons bénéficier de tous les avantages du paradigme de programmation orienté objet. L'exemple le plus simple est de savoir comment gérer les erreurs. Lorsque vous utilisez la bibliothèque ImageMagick, il vous suffit d'envelopper tout votre code dans un bloc d'essai et votre application peut s'exécuter en toute sécurité.

Comme indiqué ci-dessus, le script ImageMagick responsable de la création de miniatures ne contient aucun code lié au type d'image source. Le même code peut être utilisé pour traiter les images JPG ainsi que les fichiers PNG ou TIF. Si vous devez convertir l'image source en un autre type, ajoutez simplement une ligne de code avant d'exécuter la méthode 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>

est-ce plus clair? À mon avis, l'utilisation de fonctions de bibliothèque GD pour traiter les images n'est pas aussi pratique que ImageMagick. Bien sûr, GD a des emballages disponibles pour le rendre orienté objet, mais à ce stade, cela commence à se faire du correctif.

popularité

Étant donné que la bibliothèque GD est incluse dans toutes les nouvelles versions PHP par défaut, vous pouvez voir cette bibliothèque plus souvent dans divers projets que ImageMagick. Lorsque mon projet CakePHP avait besoin d'un composant responsable de la gestion des téléchargements d'images et de la génération de vignettes, j'ai rapidement trouvé un composant basé sur GD qui convenait à mes besoins. Vous pouvez parfois trouver des modules bien écrits qui vous permettent de choisir entre deux bibliothèques de traitement d'image, comme la bibliothèque d'images Kohana Framework, mais je crains qu'ils ne soient pas communs.

Alternatives

Vous n'avez pas à vous en tenir à une certaine bibliothèque PHP lorsque vous décidez comment traiter le traitement d'image dans votre application. Il existe d'autres solutions à considérer:

  1. Utilisez des scripts de traitement d'image en dehors de l'application PHP. Dans l'une de mes applications, je dois créer une page Web qui permet aux visiteurs de convertir des images en ligne, directement dans la fenêtre du navigateur. J'ai décidé d'utiliser la bibliothèque de traitement d'image CAMAN.js JavaScript et il a fait un excellent travail. Cette bibliothèque peut également être utilisée comme script d'arrière-plan intégré dans la plate-forme Node.js, qui a constamment augmenté en popularité.

  2. Utilisez une plate-forme de traitement d'image basée sur le cloud. Une solution basée sur le cloud peut faire le travail pour vous - après avoir envoyé le fichier source, vous pouvez obtenir des miniatures de différentes tailles ou images converties via divers filtres. Vous n'avez pas besoin d'écrire trop de code et il n'est pas limité par les capacités du serveur. Ouvrez simplement Google et trouvez certaines entreprises qui offrent de tels services.

  3. Vérifiez la fonctionnalité du composant que vous utilisez. Vous pourriez être surpris de constater que vous pouvez convertir vos images en utilisant des services déjà connectés à votre application. Par exemple, l'API Dropbox fournit des méthodes miniatures qui vous permettent d'obtenir des images JPG ou PNG dans l'une des cinq tailles disponibles. Consultez la documentation de votre bibliothèque et API et vous pouvez constater qu'ils peuvent faire ce dont vous avez besoin.

Résumé

Comme vous pouvez le voir, chaque bibliothèque de traitement d'image présente ses avantages et ses inconvénients. La bibliothèque GD est largement disponible, donc elle peut fonctionner n'importe où. Comme il est très populaire, il est facile pour vous de trouver de nombreux exemples et composants qui utilisent cette bibliothèque. Obtenir de l'aide est également plus facile, car plus de gens peuvent être familiers avec la bibliothèque GD qu'ImageMagick.

ImageMagick prend en charge plus de types de fichiers et peut convertir les images de plus de façons que les bibliothèques GD. Il vous permet également d'écrire du code plus clair et de meilleure qualité.

Enfin, il existe d'autres alternatives, telles que les services de traitement d'image cloud, qui peuvent complètement éliminer le besoin des deux bibliothèques. J'espère que cet article vous aidera à faire votre choix.

Si vous avez des questions ou des commentaires sur cet article, n'hésitez pas à commenter ci-dessous ou à me contacter via Google.

FAQ pour Imagrick et Gd

Quelle est la principale différence entre Imagick et GD en termes de fonctionnalité?

Imagrick et GD sont tous deux des bibliothèques puissantes pour le traitement d'image en PHP. Cependant, ils diffèrent considérablement dans leurs fonctions. Connu pour son ensemble de fonctionnalités étendu, Imagick propose une variété d'options de traitement d'image, y compris des fonctionnalités avancées telles que les effets de couche, les filtres d'image et les ajustements des couleurs. GD, en revanche, est plus simple et simple, en se concentrant sur les tâches de traitement d'image de base telles que le redimensionnement, le recadrage et les capacités de dessin simples. Bien que GD puisse être suffisant pour accomplir des tâches simples, Imagick est souvent le premier choix pour des exigences de traitement d'image plus complexes.

Comment Imagrick et GD se comparent-ils en termes de performances?

Les performances peuvent varier selon l'environnement des tâches et du serveur. D'une manière générale, Imagick est considéré comme consommer plus de ressources que GD en raison de son vaste ensemble de fonctionnalités. Cependant, il a également tendance à produire des résultats de meilleure qualité, en particulier lorsqu'il s'agit de tâches de traitement d'image complexes. GD, en revanche, est généralement plus rapide et consomme moins de ressources, ce qui en fait un bon choix pour des tâches ou des environnements simples avec des ressources limitées.

Lequel est le meilleur, Imagick ou GD, est meilleur pour le traitement des grandes images?

Imagick est généralement mieux adapté pour fonctionner avec de grandes images. En effet, Imagrick prend en charge une fonctionnalité appelée "Cache Pixel basée sur le disque", qui lui permet de traiter des images plus grandes que la mémoire disponible. GD, en revanche, ne prend pas en charge cette fonctionnalité, vous pouvez donc avoir des difficultés lorsque vous travaillez avec de grandes images, en particulier sur les serveurs avec une mémoire limitée.

Comment Imagrick et GD gèrent-ils la transparence?

Imagick et GD soutiennent la transparence, mais ils gèrent la transparence légèrement différemment. Imagrick prend en charge une gamme plus large d'options de transparence, y compris les canaux alpha et divers modes hybrides. D'un autre côté, GD a un soutien plus limité à la transparence, et il est parfois difficile de gérer des effets de transparence complexes.

Puis-je utiliser Imagrick et GD dans le même projet?

Oui, Imagick et GD peuvent être utilisés simultanément dans le même projet. Cependant, il est important de noter que ces deux bibliothèques utilisent des noms de syntaxe et de fonction différents, vous devez donc vous assurer que votre code est compatible avec les deux. De plus, l'utilisation des deux bibliothèques du même projet peut augmenter la complexité du code et entraîner des problèmes de performances, il est donc généralement recommandé de choisir l'un d'eux dans la mesure du possible.

Quelle bibliothèque a un soutien plus étendu: Imagick ou GD?

Imagick et GD sont largement pris en charge et activement maintenus. Cependant, GD est inclus par défaut dans la plupart des installations PHP, ce qui le rend plus universellement disponible. D'un autre côté, Imagick doit généralement être installé séparément, ce qui peut parfois entraîner des problèmes de compatibilité.

Comment Imagrick et GD se comparent-ils en termes de documentation et de soutien communautaire?

Imagick et GD ont une documentation approfondie et un soutien communautaire actif. Cependant, en raison de son historique plus long et de son utilisation plus large, GD propose souvent plus de ressources et de tutoriels prêts à l'emploi en ligne. Bien que Imagrick ait une bonne documentation, il peut prendre plus de fouilles pour trouver une solution ou un exemple spécifique.

Y a-t-il un problème de sécurité avec Imagick ou GD?

Imagick et GD sont considérés comme des bibliothèques sûres. Cependant, comme tout logiciel, ils peuvent également être exploités s'ils sont utilisés mal. Assurez-vous de toujours utiliser la dernière version de la bibliothèque et suivre les meilleures pratiques pour le codage sécurisé.

Quelle bibliothèque dois-je choisir pour mon projet: Imagick ou GD?

La sélection d'imagrick ou GD dépend des besoins spécifiques du projet. Si des capacités de traitement d'image avancées sont nécessaires ou si les grandes images doivent être traitées, Imagick peut être un meilleur choix. Cependant, si vous travaillez sur un projet plus simple ou si vous travaillez dans un environnement limité aux ressources, GD peut être un meilleur choix.

Puis-je passer de GD à Imagrick à mi-chemin du projet (et vice versa)?

Bien qu'il soit techniquement possible de passer de GD à Imagrick à mi-chemin du projet (et vice versa), cela n'est généralement pas recommandé. En effet Si vous envisagez un commutateur, il est généralement préférable de prendre une décision au début du projet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn