질문에서, 당신은 GD를 처음 접하는 것 같습니다. 저는 제 경험을 공유 할 것입니다. 아마도 이것은 주제에서 약간 벗어난 것일 수도 있지만, 당신과 같은 GD를 처음 접하는 사람에게는 도움이 될 것이라고 생각합니다.
1 단계, 파일 유효성 검사. 다음 기능을 사용하여 $_FILES['image']['tmp_name']
파일이 유효한 파일인지 확인하십시오.
function getContentsFromImage($image) {
if (@is_file($image) == true) {
return file_get_contents($image);
} else {
throw new \Exception('Invalid image');
}
}
$contents = getContentsFromImage($_FILES['image']['tmp_name']);
2 단계, 파일 형식 가져 오기 파일 (내용)의 파일 형식을 확인하려면 finfo 확장자를 사용하여 다음 기능을 시도해보십시오. $_FILES["image"]["type"]
파일 형식을 확인 하는 데 사용하지 않는 이유는 무엇입니까? 이 때문에 만 누군가가 원래라는 파일 이름을 바꿀 경우 파일 확장자는 내용을 제출하지 확인 world.png 에 world.jpg을 , $_FILES["image"]["type"]
, PNG하지 JPEG 돌아갑니다 때문에 $_FILES["image"]["type"]
잘못된 결과를 반환 할 수 있습니다.
function getFormatFromContents($contents) {
$finfo = new \finfo();
$mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
switch ($mimetype) {
case 'image/jpeg':
return 'jpeg';
break;
case 'image/png':
return 'png';
break;
case 'image/gif':
return 'gif';
break;
default:
throw new \Exception('Unknown or unsupported image format');
}
}
$format = getFormatFromContents($contents);
Step.3, GD 리소스 가져 오기 이전에 가지고 있던 콘텐츠에서 GD 리소스를 가져옵니다.
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
4 단계, 이미지 크기 가져 오기 이제 다음과 같은 간단한 코드로 이미지 크기를 가져올 수 있습니다.
$width = imagesx($resource);
$height = imagesy($resource);
이제 원본 이미지에서 가져온 변수를 살펴 보겠습니다.
$contents, $format, $resource, $width, $height
OK, lets move on
5 단계, 크기 조정 된 이미지 인수 계산 이 단계는 질문과 관련이 있습니다. 다음 함수의 목적은 GD 함수에 대한 크기 조정 인수를 가져 오는 것입니다 imagecopyresampled()
. 코드는 다소 길지만 훌륭하게 작동하며 세 가지 옵션도 있습니다 : 늘이기, 축소 , 채우기.
stretch : 출력 이미지의 치수가 설정 한 새 치수와 동일합니다. 높이 / 너비 비율을 유지하지 않습니다.
축소 : 출력 이미지의 크기가 새로운 크기를 초과하지 않고 이미지 높이 / 너비 비율을 유지합니다.
fill : 출력 이미지의 크기는 사용자가 지정한 새 크기와 동일하며필요한 경우 이미지를 자르고 크기를 조정 하며 이미지 높이 / 너비 비율을 유지합니다. 이 옵션은 질문에 필요한 것입니다.
function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
if ($option === 'stretch') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
$dst_w = $newwidth;
$dst_h = $newheight;
$src_w = $width;
$src_h = $height;
$src_x = 0;
$src_y = 0;
} else if ($option === 'shrink') {
if ($width <= $newwidth && $height <= $newheight) {
return false;
} else if ($width / $height >= $newwidth / $newheight) {
$dst_w = $newwidth;
$dst_h = (int) round(($newwidth * $height) / $width);
} else {
$dst_w = (int) round(($newheight * $width) / $height);
$dst_h = $newheight;
}
$src_x = 0;
$src_y = 0;
$src_w = $width;
$src_h = $height;
} else if ($option === 'fill') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
if ($width / $height >= $newwidth / $newheight) {
$src_w = (int) round(($newwidth * $height) / $newheight);
$src_h = $height;
$src_x = (int) round(($width - $src_w) / 2);
$src_y = 0;
} else {
$src_w = $width;
$src_h = (int) round(($width * $newheight) / $newwidth);
$src_x = 0;
$src_y = (int) round(($height - $src_h) / 2);
}
$dst_w = $newwidth;
$dst_h = $newheight;
}
if ($src_w < 1 || $src_h < 1) {
throw new \Exception('Image width or height is too small');
}
return array(
'dst_x' => 0,
'dst_y' => 0,
'src_x' => $src_x,
'src_y' => $src_y,
'dst_w' => $dst_w,
'dst_h' => $dst_h,
'src_w' => $src_w,
'src_h' => $src_h
);
}
$args = getResizeArgs($width, $height, 150, 170, 'fill');
6 단계, 크기 조정 이미지 를 사용하여 $args
, $width
, $height
, $format
우리는 다음과 같은 기능으로 위에서했고 크기가 조정 된 이미지의 새로운 자원을 얻을 $ 자원 :
function runResize($width, $height, $format, $resource, $args) {
if ($args === false) {
return;
}
$newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
if ($format === 'png') {
imagealphablending($newimage, false);
imagesavealpha($newimage, true);
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
} else if ($format === 'gif') {
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
imagecolortransparent($newimage, $transparentindex);
}
imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
imagedestroy($resource);
return $newimage;
}
$newresource = runResize($width, $height, $format, $resource, $args);
7 단계 : 새 콘텐츠 가져 오기 , 다음 함수를 사용하여 새 GD 리소스에서 콘텐츠를 가져옵니다.
function getContentsFromGDResource($resource, $format) {
ob_start();
switch ($format) {
case 'gif':
imagegif($resource);
break;
case 'jpeg':
imagejpeg($resource, NULL, 100);
break;
case 'png':
imagepng($resource, NULL, 9);
}
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
$newcontents = getContentsFromGDResource($newresource, $format);
단계 8 확장을 가져오고 , 다음 함수를 사용하여 이미지 형식에서 확장을 가져옵니다 (참고, 이미지 형식이 이미지 확장과 같지 않음).
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
9 단계 이미지 저장 mike라는 사용자가있는 경우 다음을 수행 할 수 있으며이 PHP 스크립트와 동일한 폴더에 저장됩니다.
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
10 단계 리소스 파괴 GD 리소스 파괴를 잊지 마세요!
imagedestroy($newresource);
또는 모든 코드를 클래스에 작성하고 다음을 사용할 수 있습니다.
public function __destruct() {
@imagedestroy($this->resource);
}
팁
사용자가 업로드 한 파일 형식을 변환하지 않는 것이 좋습니다. 많은 문제가 발생합니다.