PHP 이미지 처리 분야에서 ImageFlip ()는 이미지를 수평, 수직 또는 양방향으로 뒤집을 수있는 매우 실용적인 기능입니다. 이러한 종류의 작업은 이미지 편집, 이미지 특수 효과 생성 및 이미지 인식 전 처리에 널리 사용됩니다. 그렇다면이 기능은 어떻게 바닥에서 구현됩니까? 이미지는 메모리에서 어떻게 구성됩니까? 이 기사를 사용하면 메모리 구조의 관점에서 ImageFlip () 의 구현 원리를 분석하게됩니다.
ImageFlip () 는 PHP GD 라이브러리의 함수이며 기본 구문은 다음과 같습니다.
bool imageflip(GdImage $image, int $mode)
여기서 $ 모드는 다음 상수 중 하나 일 수 있습니다.
img_flip_horizontal : 수평 플립
img_flip_vertical : 수직 플립
IMG_FLIP_BOTH : 수평 및 수직으로 동시에 플립
샘플 코드 :
$image = imagecreatefromjpeg('https://m66.net/images/sample.jpg');
imageflip($image, IMG_FLIP_HORIZONTAL);
imagejpeg($image, 'flipped.jpg');
imagedestroy($image);
PHP는 GD 라이브러리를 사용하여 이미지를 처리하며 모든 이미지 리소스는 GDIMAGE 구조 (C 레벨에서 구현)로 메모리로 표시됩니다. 이 구조에서, 이미지의 각 픽셀은 2 차원 어레이 형태로 저장되며, 구조는 다음과 같습니다.
typedef struct {
int sx; // 이미지 너비
int sy; // 이미지 높이
int **pixels; // 픽셀 배열에 대한 포인터
...
} gdImage;
각 픽셀은 RGBA의 정보를 포함하는 정수, 일반적으로 32 비트입니다.
C 언어 수준에서 PHP의 ImageFlip ()는 실제로 픽셀 데이터를 GDIMAGE 구조의 재사용합니다. 수평 플립을 사용하여 그 원리를 설명하자.
이미지의 각 행을 반복 한 다음 각 행에서 왼쪽과 오른쪽으로 픽셀을 대칭으로 바꿉니다. 예를 들어 너비 4의 이미지의 경우 :
원래의: A B C D
튀기다: D C B A
의사 코드의 기본 구현은 다음과 같습니다.
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;
}
}
현재 이미지의 각 열을 반복 한 다음 상하 대칭 행의 행을 교환합니다.
원래의:
1좋아요: A B C
2좋아요: D E F
3좋아요: G H I
튀기다:
1좋아요: G H I
2좋아요: D E F
3좋아요: A B C
의사 코드 :
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;
}
이 작업은 위의 두 프로세스를 하나씩 실행하는 것입니다.
PHP는 기준 계수 메커니즘이므로 이미지 리소스가 잘못 릴리스되거나 재사용되는 것을 방지하기 위해 처리 될 때마다 $ 이미지 리소스가 고유 한 사본임을 보장합니다. 또한 메모리 누출을 피하기 위해 개발자는 이미지 리소스를 수동으로 해제해야합니다.
imagedestroy($image);
이것은 gdimage 가 차지하는 메모리를 제거합니다.
많은 소셜 플랫폼을 통해 사용자는 업로드 된 아바타를 뒤집을 수 있으며 다음과 같은 간단한 코드를 사용하여 구현할 수 있습니다.
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);
}
ImageFlip () 의 구현 원리는 간단하지만 이미지 데이터가 2 차원 방식으로 저장되고 작동하는 방식을 반영합니다. 이 원칙을 마스터 한 후에는 PHP 이미지 기능을보다 유연하게 사용할 수있을뿐만 아니라 이미지 처리 라이브러리의 추가 개발을위한 좋은 토대를 마련 할 수 있습니다.
뒤집힌 렌더링을 만들거나 이미지 향상 달성 또는보다 복잡한 이미지 계산을 수행하든 이미지의 메모리 구조를 이해하는 것이 항상 핵심 단계의 기초입니다.