PHP에서는 데이터 URI(Data URI) 스킴을 활용하면 이미지 파일을 디스크에 따로 저장하지 않고도 이진 데이터(binary data)만으로 이미지를 다시 만들어 브라우저에 바로 표시할 수 있습니다. 핵심은 <img> 태그의 src 속성에 데이터 URI를 직접 지정하는 것으로, 이 방식은 이미지를 가공한 후 임시 파일로 저장할 필요가 없어 매우 효율적입니다.
데이터 URI의 기본 형식
data:[<MIME-type>][;charset="<encoding>"][;base64],<data>
- MIME-type: 이미지의 유형을 나타냅니다(예:
image/png,image/jpeg). - charset: 문자 인코딩 방식을 지정합니다.
- base64: 데이터가 base64로 인코딩되었음을 의미합니다.
- data: 실제 인코딩된 데이터 값입니다.
PHP 구현 예제
<?php
function data_uri($file, $mime) {
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:' . $mime . ';base64,' . $base64);
}
?>
<img src="<?php echo data_uri('some_image.png', 'image/png'); ?>" alt="Image sample" />
코드 동작 원리
data_uri() 함수는 다음 순서로 동작합니다.
file_get_contents()함수로 이미지 파일의 내용을 읽어$contents변수에 담습니다.base64_encode()함수를 통해 해당 내용을 base64 형식으로 인코딩합니다.- MIME 타입과 인코딩된 데이터를 연결한 완전한 데이터 URI 문자열을 반환합니다.
반환된 값을 <img> 태그의 src 속성에 출력하면, 브라우저가 이진 데이터를 해석하여 이미지를 화면에 그려 줍니다. 즉, 이미지를 이 함수에 전달하는 것만으로 재생성과 표시가 한 번에 이루어집니다.
활용 시 참고 사항
- 이미지를 가공한 후 디스크에 저장하지 않고 곧바로 출력해야 하는 상황에서 특히 유용합니다.
- base64 인코딩은 원본 대비 약 33% 정도 크기가 증가하므로, 용량이 큰 이미지에는 적합하지 않습니다.
- CSS 배경 이미지나 이메일 템플릿처럼 외부 리소스 로딩이 어려운 환경에서도 활용할 수 있습니다.
- 모든 주요 최신 브라우저에서 데이터 URI를 지원하지만, 구형 브라우저(예: IE 8 이하)는 크기 제한 등으로 동작이 제한될 수 있습니다.