Dans le domaine du traitement d'image PHP, ImageFlip () est une fonction très pratique qui nous permet de retourner les images horizontalement, verticalement ou bidirectionnelles. Ce type d'opération est largement utilisé dans l'édition d'images, la génération d'effets spéciaux d'image et même le prétraitement de reconnaissance d'image. Alors, comment cette fonction est-elle implémentée en bas? Comment les images sont-elles organisées en mémoire? Cet article vous amènera à analyser le principe de mise en œuvre de ImageFlip () du point de vue de la structure de la mémoire.
ImageFlip () est une fonction dans la bibliothèque PHP GD, et sa syntaxe de base est la suivante:
bool imageflip(GdImage $image, int $mode)
où le mode $ peut être l'une des constantes suivantes:
Img_flip_horizontal : flip horizontal
IMG_FLIP_VERTICAL : Flip vertical
Img_flip_both : flip horizontalement et verticalement simultanément
Exemple de code:
$image = imagecreatefromjpeg('https://m66.net/images/sample.jpg');
imageflip($image, IMG_FLIP_HORIZONTAL);
imagejpeg($image, 'flipped.jpg');
imagedestroy($image);
PHP utilise la bibliothèque GD pour traiter les images, et toutes les ressources d'image sont représentées en mémoire en tant que structures GDIMage (implémentées au niveau C). Dans cette structure, chaque pixel de l'image est stocké sous la forme d'un tableau bidimensionnel, et la structure est à peu près la suivante:
typedef struct {
int sx; // Largeur d'image
int sy; // Hauteur de l'image
int **pixels; // Pointer vers Pixel Table
...
} gdImage;
Chaque pixel est un entier, généralement 32 bits, contenant les informations de RGBA.
Au niveau du langage C, ImageFlip () de PHP réorganise en fait les données de pixels dans la structure GDImage . Utilisons le flip horizontal comme exemple pour illustrer son principe:
Itérer à travers chaque ligne de l'image, puis échangez des pixels symétriques à gauche et à droite dans chaque ligne. Par exemple, pour les images avec la largeur 4:
original: A B C D
Retourner: D C B A
L'implémentation sous-jacente du pseudo-code est la suivante:
for (y = 0; y < image->sy; y++) {
for (x = 0; x < image->sx / 2; x++) {
temp = image->pixels[y][x];
image->pixels[y][x] = image->pixels[y][image->sx - 1 - x];
image->pixels[y][image->sx - 1 - x] = temp;
}
}
À l'heure actuelle, parcourez chaque colonne de l'image, puis échangez des lignes de haut en bas symétrique:
original:
1D'ACCORD: A B C
2D'ACCORD: D E F
3D'ACCORD: G H I
Retourner:
1D'ACCORD: G H I
2D'ACCORD: D E F
3D'ACCORD: A B C
Pseudocode:
for (y = 0; y < image->sy / 2; y++) {
temp_row = image->pixels[y];
image->pixels[y] = image->pixels[image->sy - 1 - y];
image->pixels[image->sy - 1 - y] = temp_row;
}
Cette opération consiste à exécuter les deux processus ci-dessus un par un.
Étant donné que PHP est un mécanisme de comptage de référence, pour empêcher les ressources d'image d'être libérés ou réutilisés à tort, chaque fois qu'il est traité, il est assuré que la ressource d'image $ est la copie unique. De plus, afin d'éviter les fuites de mémoire, les développeurs doivent libérer manuellement les ressources d'image:
imagedestroy($image);
Cela effacera la mémoire occupée par Gdimage .
De nombreuses plateformes sociales permettent aux utilisateurs de retourner les avatars téléchargés, qui peuvent être implémentés en utilisant le code simple suivant:
if ($_FILES['avatar']['tmp_name']) {
$image = imagecreatefromjpeg($_FILES['avatar']['tmp_name']);
imageflip($image, IMG_FLIP_VERTICAL);
imagejpeg($image, '/var/www/m66.net/uploads/flipped_avatar.jpg');
imagedestroy($image);
}
Bien que le principe d'implémentation de ImageFlip () soit simple, il reflète la façon dont les données d'image sont stockées et fonctionnelles de manière bidimensionnelle en mémoire. Après avoir maîtrisé ce principe, vous pouvez non seulement utiliser les fonctions d'image PHP de manière plus flexible, mais également présenter une bonne base pour le développement ultérieur de bibliothèques de traitement d'image.
Qu'il s'agisse de rendre les rendus inversés, d'obtenir une amélioration de l'image ou d'effectuer des calculs d'image plus complexes, la compréhension de la structure de mémoire d'une image est toujours la base d'une étape clé.