PHP
GD로 이미지 처리
수색…
비고
header("Content-Type: $mimeType");
그리고 이미지 _을 출력에 이미지 만 생성하려면, 아무것도 출력하지 말고, ?>
뒤에 빈 줄을 적어 image____
. (추적하기가 어려운 '버그'일 수 있습니다. 왜 이미지가없고 이유에 대한 단서가 없습니다.) 일반적인 조언은 여기에?> 포함하지 말아야한다는 것입니다.
이미지 만들기
빈 이미지를 만들려면 imagecreatetruecolor
함수를 사용하십시오.
$img = imagecreatetruecolor($width, $height);
$img
는 이제 $width
x $height
픽셀의 이미지 리소스에 대한 리소스 변수입니다. 왼쪽에서 오른쪽으로의 너비 카운트와 위에서 아래로의 높이 카운트에주의하십시오.
이미지 리소스는 다음과 같은 이미지 생성 기능을 통해 만들 수도 있습니다.
-
imagecreatefrompng
-
imagecreatefromjpeg
- 다른
imagecreatefrom*
기능.
이미지 리소스는 더 이상 참조가 없을 때 해제 될 수 있습니다. 그러나 메모리를 즉시 해제하려면 (많은 대형 이미지를 처리하는 경우 중요 할 수 있음) 이미지에 imagedestroy()
를 사용하면 더 이상 사용하지 않는 것이 좋습니다.
imagedestroy($image);
이미지 변환하기
이미지 변환으로 생성 된 이미지는 출력 할 때까지 이미지를 수정하지 않습니다. 따라서 이미지 변환기는 세 줄의 코드처럼 간단 할 수 있습니다.
function convertJpegToPng(string $filename, string $outputFile) {
$im = imagecreatefromjpeg($filename);
imagepng($im, $outputFile);
imagedestroy($im);
}
이미지 출력
image*
함수를 사용하여 image*
만들 수 있습니다. 여기서 *
는 파일 형식입니다.
그들은이 문법을 공통적으로 가지고 있습니다 :
bool image___(resource $im [, mixed $to [ other parameters]] )
파일에 저장 중
이미지를 파일에 저장하려면 $to
로 파일 이름 또는 열린 파일 스트림을 전달할 수 있습니다. 스트림을 전달하면 GD가 스트림을 자동으로 닫을 수 있기 때문에 스트림을 닫을 필요가 없습니다.
예를 들어 PNG 파일을 저장하려면 다음과 같이하십시오.
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
fopen
을 사용할 때는 파일이 바이너리 출력이기 때문에 t
플래그 대신 b
플래그를 사용해야합니다.
패스하려고하지 마십시오 fopen("php://temp", $f)
또는 fopen("php://memory", $f)
그것. 스트림은 호출 후에 함수에 의해 닫히므로 스트림을 내용을 검색하는 등 더 이상 사용할 수 없습니다.
HTTP 응답으로 출력
이 이미지를 이미지의 응답으로 직접 반환하려는 경우 (예 : 동적 배지 만들기) 두 번째 인수로 아무것도 전달하지 않거나 null
을 전달할 필요가 없습니다. 그러나 HTTP 응답에서 콘텐츠 유형을 지정해야합니다.
header("Content-Type: $mimeType");
$mimeType
은 반환 할 형식의 MIME 형식입니다. 예를 들어 image/png
, image/gif
및 image/jpeg
있습니다.
변수에 기록하기
변수에 쓰는 방법에는 두 가지가 있습니다.
OB (출력 버퍼링) 사용
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
스트림 래퍼 사용
출력 버퍼링을 사용하지 않으려는 이유는 여러 가지가 있습니다. 예를 들어, 이미 OB가있을 수 있습니다. 따라서 대안이 필요합니다.
stream_wrapper_register
함수를 사용하면 새로운 스트림 래퍼를 등록 할 수 있습니다. 따라서 스트림을 이미지 출력 함수에 전달하고 나중에 검색 할 수 있습니다.
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
이 예제에서 GlobalStream
클래스는 모든 입력을 참조 변수에 씁니다 (즉, 주어진 이름의 전역 변수에 간접적으로 쓰기). 전역 변수는 나중에 직접 검색 할 수 있습니다.
주의해야 할 몇 가지 특별한 사항이 있습니다.
- 완벽하게 구현 스트림 래퍼 클래스는 같아야 이 있지만,와 테스트에 따라
__call
마술 방법 만stream_open
,stream_write
및stream_close
내부 함수에서 호출된다. -
fopen
호출에는 플래그가 필요하지 않지만 적어도 빈 문자열은 전달해야합니다. 이것은fopen
함수가 이러한 매개 변수를 필요로stream_open
구현에서 사용하지 않더라도 더미 매개 변수가 여전히 필요하기 때문입니다. - 테스트에 따르면
stream_write
는 여러 번 호출됩니다.=
(직접 변수 할당)이 아닌.=
(연결 할당)을 사용하십시오.
사용 예
<img>
HTML 태그에서 외부 링크를 사용하지 않고 직접 이미지를 제공 할 수 있습니다.
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';
이미지 자르기 및 크기 조정
이미지가 있고 새 치수를 사용하여 새 이미지를 만들려는 경우 imagecopyresampled
함수를 사용할 수 있습니다.
먼저 원하는 크기로 새 image
를 만듭니다.
// new image
$dst_img = imagecreatetruecolor($width, $height);
원본 이미지를 변수에 저장합니다. 이를 위해 createimagefrom*
는 createimagefrom*
함수 중 하나를 사용할 수 있습니다.
- jpeg
- gif
- PNG
- 끈
예 :
//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));
이제 imagecopyresampled에 의해 원본 이미지 (src_img)의 전부 또는 일부를 새 이미지 (dst_img)에 imagecopyresampled
.
imagecopyresampled($dst_img, $src_img,
$dst_x ,$dst_y, $src_x, $src_y,
$dst_width, $dst_height, $src_width, $src_height);
src_*
및 dst_*
치수를 설정하려면 아래 이미지를 사용하십시오.
이제 원본 (초기) 이미지 전체를 대상 영역 전체로 복사하려는 경우 (자르지 않음) :
$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image