Im Bereich der PHP -Bildverarbeitung ist ImageFlip () eine sehr praktische Funktion, mit der wir Bilder horizontal, vertikal oder bidirektional umdrehen können. Diese Art der Operation wird häufig bei Bildbearbeitung, Bildspezialeffekten und sogar Bilderkennungsvorverarbeitung verwendet. Wie wird diese Funktion unten implementiert? Wie sind Bilder im Gedächtnis organisiert? In diesem Artikel werden Sie zur Analyse des Implementierungsprinzips von ImageFlip () aus der Perspektive der Speicherstruktur analysiert.
ImageFlip () ist eine Funktion in der PHP -GD -Bibliothek, und ihre grundlegende Syntax lautet wie folgt:
bool imageflip(GdImage $image, int $mode)
wobei $ modus einer der folgenden Konstanten sein kann:
Img_flip_horizontal : horizontaler Flip
IMG_FLIP_VERTICAL : vertikaler Flip
Img_flip_both : horizontal und vertikal gleichzeitig flip
Beispielcode:
$image = imagecreatefromjpeg('https://m66.net/images/sample.jpg');
imageflip($image, IMG_FLIP_HORIZONTAL);
imagejpeg($image, 'flipped.jpg');
imagedestroy($image);
PHP verwendet die GD -Bibliothek, um Bilder zu verarbeiten, und alle Bildressourcen werden im Speicher als GDIMage -Strukturen (implementiert auf C -Ebene) dargestellt. In dieser Struktur wird jedes Pixel des Bildes in Form eines zweidimensionalen Arrays gespeichert, und die Struktur ist ungefähr wie folgt:
typedef struct {
int sx; // Bildbreite
int sy; // Bildhöhe
int **pixels; // Zeiger auf Pixelarray
...
} gdImage;
Jedes Pixel ist eine Ganzzahl, normalerweise 32 Bit, die die Informationen von RGBA enthält.
Auf der C -Sprachebene leitet das ImageFlip () von PHP die Pixeldaten in der GDIMage -Struktur angeordnet. Verwenden wir horizontales Flip als Beispiel, um sein Prinzip zu veranschaulichen:
Iterieren Sie durch jede Zeile des Bildes und tauschen Sie dann die Pixel links und rechts in jeder Zeile aus. Zum Beispiel für Bilder mit Breite 4:
Original: A B C D
Flip: D C B A
Die zugrunde liegende Implementierung von Pseudo-Code ist wie folgt:
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;
}
}
Zu diesem Zeitpunkt durch jede Spalte des Bildes und tauschen Sie dann Zeilen von Auf und Ab -Symmetrik aus:
Original:
1OK: A B C
2OK: D E F
3OK: G H I
Flip:
1OK: G H I
2OK: D E F
3OK: 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;
}
Diese Operation soll die beiden oben genannten Prozesse einzeln ausführen.
Da PHP ein Referenzzählmechanismus ist, um zu verhindern, dass Bildressourcen fälschlicherweise freigegeben oder wiederverwendet werden, wird jedes Mal sichergestellt, dass die $ Image -Ressource die eindeutige Kopie ist. Um Speicherlecks zu vermeiden, müssen Entwickler die Bildressourcen manuell freigeben:
imagedestroy($image);
Dies wird die von GDIMage besetzte Erinnerung beseitigen.
Viele soziale Plattformen ermöglichen es Benutzern, hochgeladene Avatare durchzusetzen, die mit dem folgenden einfachen Code implementiert werden können:
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);
}
Obwohl das Implementierungsprinzip von ImageFlip () einfach ist, spiegelt es wider, wie Bilddaten im Speicher auf zweidimensionale Weise gespeichert und betrieben werden. Nach dem Beherrschen dieses Prinzips können Sie nicht nur flexibler PHP -Bildfunktionen verwenden, sondern auch eine gute Grundlage für die Weiterentwicklung von Bildverarbeitungsbibliotheken legen.
Unabhängig davon, ob es umgedrehte Renderings, die Erreichung der Bildverbesserung oder die Durchführung komplexerer Bildberechnungen ist, ist das Verständnis der Speicherstruktur eines Bildes immer die Grundlage für einen Schlüsselschritt.