수색…


비고

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/gifimage/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_writestream_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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow