2010-02-02 3 views
3

이 코드를 살펴본 결과 문서를 살펴본 적이 있지만 여전히 어떻게 작동하는지 이해할 수 없습니다. 코드가 제대로 작동하지만 머리글을 jpeg 대신 png로 출력해야하는지 궁금합니다.PHP gd 라이브러리 설명

이 코드에서 정확히 무엇이 일어나고 있습니까? png 이미지가 jpeg로 변환 되었습니까?

내가 궁극적으로하고 싶은 것은 단일 디렉토리에서 모든 gif, jpg, bmp 및 png 이미지를 워터 마킹하는 것입니다. jpg와 같은 이미지 유형에 관계없이 모든 헤더를 출력합니다. 이 올바른지? 나는 여기서 내가 이해하기를 바란다. 나는 좀 피곤하다.

// Load the PNG file from disk into memory 
$im2 = imagecreatefrompng($image) 

$im2

지금 resource이며, 이미지를 참조하는 다음과 같이

$im2 = imagecreatefrompng($image) 
imagecopy() and more code here 
header("Content-Type: image/jpeg"); 
imagejpeg($im2,'',50); 

답변

3

은 무엇 코드가하는 일은 더 많거나 적은이다. 일단 메모리에 있으면 png 또는 jpeg가 아닙니다. 원시 압축되지 않은 데이터입니다. 이미지의 "형식"은 원시 데이터가 패키지되고 형식화되는 방법을 지정합니다. 이 시점에서 에는 같은 서식이 없습니다. 그것은 단지 메모리에있는 데이터입니다.

// Some code which works with the image in memory, adding your watermark? 
imagecopy() and more code here 

// Tell the browser that we're output a JPG 
header("Content-Type: image/jpeg"); 

그런 다음 서버가이 헤더를 작성을 담당한다 (즉, http://host.com/image.jpg)는 JPG를 요청하는 경우. PHP를 통해 JPG를 즉석에서 작성하는 경우 헤더를 수동으로 출력해야합니다. 그렇지 않으면 PHP는 echo을 통해 또는 <?php ?> 태그 외부에 텍스트/공백을 사용하여 HTML을 작성하고 stdout에 아무 것도 쓰지 않으면 적절한 헤더를 출력한다고 가정합니다.

// compress as a jpeg, and send to browser 
imagejpeg($im2,'',50); 

imagejpeg는 JPG로 압축 원시 이미지를 받아, 또는 (브라우저로 전송) 표준 출력 (당신이 파일 이름을 제공하는 경우) 중 하나의 파일에 기록합니다. 기술적으로 브라우저에 출력하려면 두 번째 인수는 null이어야하며 ''이 아야합니다. 마지막 매개 변수 인 50은 jpeg 품질을 백분율로 지정합니다. 100은 고품질, 0은 낮은 품질입니다.

+0

아, 확인 ..서버에 저장된 이미지가 원시 형식이므로 올바르게 이해하고 있다면 이미지가 출력되는 것은 사실 jpg입니다. 옳은? – timmay

+0

표제 : 대단한 설명에 감사드립니다. – timmay

+0

@timmay : 아니요. 'imagejpeg'가 사용 되었기 때문에 이미지는 jpeg 형식으로 출력됩니다. 'imagepng'가 마지막에 사용되면 출력 형식은 png가됩니다. –

1

imagejpeg 기능은 원본 개체의 형식에 관계없이 JPEG 형식의 이미지를 출력합니다. 원본 형식을 유지하려면 파일을로드 할 때이를 결정한 다음 출력을 생성 할 때 다른 기능을 사용해야합니다. - imagepng, imagegif 등의 기능이 있습니다.

+0

감사합니다. Alxp. 그래서 브라우저가 이미지를 출력 한 후에도 파일 확장자가 여전히 png라고해도 괜찮습니까? – timmay

+0

모든 파일 형식에 대해 함수를 만들고 확장과 일치하는 헤더를 출력해야하는지 궁금합니다. – timmay

1

코드가 이미지를 GD 리소스로로드하는 중입니다. PNG 파일에서 가져온 다음 PNG 파일을 조작하고 마지막으로 이미지를 다른 형식 (JPEG)으로 브라우저에 출력합니다.

imagecreatefrompng으로 전화를 걸면 GD가 이미지의 현재 작업 복사본으로 사용해야한다는 것을 지정하는 것이 아니라 파일을 읽고 PNG 형식에서 디코딩 한 다음로드하는 것입니다 알 수없는 내부 형식으로 메모리에 저장합니다. 이 시점에서 이미지를 처음 읽은 파일의 형식은 더 이상 중요하지 않습니다. 출력 할 때 더 이상 형식이 연결되지 않으므로 원하는 형식을 지정해야합니다. 이것이 imagejpeg을 사용하는 이유입니다.

+0

알겠습니다. 감사합니다. 이것은 정확히 메가가 말한 것입니다. 그럼 내가 물어 보자. 조작중인 원본 이미지가 png 이미지 인 경우 브라우저에서 이미지를 브라우저로 출력 할 때 확장명은 여전히 ​​png입니다. 이게 중요합니까? – timmay

+0

파일의 확장자는 여전히 '.png'입니다. 예, 파일을 출력하지 않습니다. 파일에서 완전히 분리 된 이미지의 메모리 내 사본을 출력하고 있습니다. 브라우저는 파일의 확장자가 무엇인지에 대해 알지 못합니다. –

+0

알았어, 그게 내 유일한 관심사 야. 따라서 출력하는 각 파일 유형에 대해 다른 기능을 만들 필요가 없습니다. 그것은 실제로 좋은 소식입니다. Zakalwe에게 감사드립니다. – timmay

1

imagecreatefrompng은 PNG 파일에서 이미지 데이터를로드하고 있습니다. 이 시점의 이미지 데이터는 GD 전용 픽셀 데이터입니다.

imagejpeg은 픽셀 데이터를 jpeg로 출력합니다. 따라서이 경우 헤더가 jpeg를 지정해야합니다.