Programing

단일 투명 픽셀 (PNG 또는 GIF)을 렌더링하는 PHP 스크립트

lottogame 2021. 1. 5. 07:40
반응형

단일 투명 픽셀 (PNG 또는 GIF)을 렌더링하는 PHP 스크립트


하나의 투명한 점 (PNG 또는 GIF)의 이미지 스트림을 반환하는 PHP를 만들어야합니다.

사용하기 쉬운 솔루션을 알려 주시겠습니까?


투명한 1x1 PNG :

header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');

투명한 1x1 GIF :

header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');

PHP 5.4 이상에서는 base64_decode보다 약 2 배 빠른 hex2bin 을 사용할 수 있습니다 (아래 빈 GIF 파일로 테스트 됨). 이미지를 출력하는 코드는 다음과 같습니다.

투명한 1x1 PNG :

header('Content-Type: image/png');
die(hex2bin('89504e470d0a1a0a0000000d494844520000000100000001010300000025db56ca00000003504c5445000000a77a3dda0000000174524e530040e6d8660000000a4944415408d76360000000020001e221bc330000000049454e44ae426082'));

투명한 1x1 GIF :

header('Content-Type: image/gif');
die(hex2bin('47494638396101000100900000ff000000000021f90405100000002c00000000010001000002020401003b'));

base64로 인코딩 된 데이터를 16 진수로 쉽게 변환 할 수 있습니다.

echo bin2hex(base64_decode($data));

또는 파일 :

echo bin2hex(base64_decode(file_get_contents($filename)));

그러나 내 벤치 마크에 따르면 @Lukas Liesis가 제안한 네이티브 PHP 이스케이프 방법을 사용하는 것이 base64_decode보다 약 12.5 배 더 빠릅니다. 그리고 거의 모든 버전의 PHP에서 작동합니다. 다음은 코드 조각입니다.

투명한 1x1 PNG :

header('Content-Type: image/png');
die("\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x00\x00\x25\xdb\x56\xca\x00\x00\x00\x03\x50\x4c\x54\x45\x00\x00\x00\xa7\x7a\x3d\xda\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\x00\x0a\x49\x44\x41\x54\x08\xd7\x63\x60\x00\x00\x00\x02\x00\x01\xe2\x21\xbc\x33\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82");

투명한 1x1 GIF :

header('Content-Type: image/gif');
die("\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x90\x00\x00\xff\x00\x00\x00\x00\x00\x21\xf9\x04\x05\x10\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x04\x01\x00\x3b");

정규 표현식을 사용하면 이러한 문자열을 쉽게 만들 수 있습니다 (한 번만 수행하면 빠르게 작동 할 필요가 없습니다).

echo preg_replace('/../','\\x\0',bin2hex($data));

또는 파일에서 :

echo preg_replace('/../','\\x\0',bin2hex(file_get_contents($filename)));

사람들의 질문에 대한 몇 가지 답변 :

이미지의 내용을 에코해야합니다. 헤더는 텍스트가 아니라 이미지를 반환한다는 것을 보여줍니다. 따라서 헤더를 반환했다면 데이터가없는 헤더 일뿐입니다. 그런 다음 이미지의 데이터를 인쇄하고 완료하면 이미지를 보냅니다. :)

파일을 읽는 것은 좋지 않고 작동 할 수 있지만 Sjoerd의 주요 답변에 표시된 것처럼 원시 데이터를 반환하는 것이 좋습니다. 하나의 읽기 작업을 저장했기 때문입니다. 디스크에서 읽는 것은 느린 작업입니다. 요즘에는 SSD 디스크로 속도가 빨라졌지만 여전히. 디스크에 대한 I / O가없는 것이 좋습니다.

이 코드는 base64 디코딩 없이도 있었지만이 이미지는 흰색입니다.

header('Content-Type: image/gif');
// 1x1px white gif
die("\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0\x0\x0\x2a\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b");

누군가 파일을 이러한 데이터 문자열로 변환하는 방법을 알고 있습니까?


Linux에서는 콘솔에 다음을 입력하여 변환 할 수 있습니다.

hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo

참조 URL : https://stackoverflow.com/questions/3203354/php-script-to-render-a-single-transparent-pixel-png-or-gif

반응형