2013-03-14 2 views
3

나는 사용자가 게시 한 PHP 사이트에서 약간 수정 한 다음 기능을 사용하고 있습니다. 내가 사용/GD 문제를 상상해보십시오 (PHP)

function createImgText ($string=NULL, $fontsize=0, $marginX=0, $imgH=0, $fontfile=NULL, $imgColorHex=NULL, $txtColorHex=NULL){ 
    if($string != ""){ 
    //header("Content-type: image/png");  
    // 
    $spacing = 0; 

    $line = array("linespacing" => $spacing); 

    if (file_exists($fontfile)) $box = @imageftbbox($fontsize,0,$fontfile,$string,$line) or die('Box command error'); 
    else die("ERROR - font"); 

    $tw=$box[4]-$box[0]; //image width 
    $marginY = $imgH - (($imgH - $fontsize)/2); 
    $imgWidth = $tw + (2*$marginX); 
    $im = ImageCreate($imgWidth, $imgH); 
    $int = hexdec($imgColorHex); 
    $arr = array("red" => 0xFF & ($int >> 0x10), 
      "green" => 0xFF & ($int >> 0x8), 
      "blue" => 0xFF & $int); 
    $black = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]); 
    $int = hexdec($txtColorHex); 
    $arr = array("red" => 0xFF & ($int >> 0x10), 
      "green" => 0xFF & ($int >> 0x8), 
      "blue" => 0xFF & $int); 
    $white = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]); 
    ImageFtText($im, $fontsize, 0, $marginX, $marginY, $white, $fontfile, $string, array()); 
    ImagePng($im); 
    ImageDestroy($im); 
}else{ 
    echo "ERROR - no string"; 
} 
} 

내 index.php를

error_reporting(-1); 
    ini_set('display_errors', true); 

이미지를 출력 페이지에 다음과 같습니다.

나는 오류가 없습니다. :( 그러나, 헤더 부분의 주석 "을 이미지 오류를 포함하고 표시되지 않습니다"라고 파이어 폭스가 발생

이미지 PHP 파일 :.

<?php 
error_reporting(-1); 
ini_set('display_errors', true); 
$code = $sys->core->generateRandomString($sys->settings['captchal']); 
echo 'Debug: Using string: ' . $code . ' font: fonts/' . $sys->settings['captchaf'] . '<br>'; 


$sys->core->createImgText($code, 9, 10, 18, 'fonts/' . $sys->settings['captchaf'], "000000", "FFFFFF"); 
?> 

그것은 말한다 :

Debug: Using string: nrcujP font: fonts/airstream.ttf 
�PNG IHDR0�[email protected]�PLTE������������???___uV#�pIDAT�c` �E�D�x���*�s�bP  �@fR�SVV``�F�[email protected]�+4h3k6 �),6F�!�P�LHPTD8� �c�p�,�8�(�8�Q+|�Q��IEND�B`� 

<?php echo phpinfo(); ?> 

페이지가 있는데 GD가 활성화되어 있고 모든 애드온 TTF 지원 포함. 누구나 전에 비슷한 문제가 있습니까? 나는 다른 것을 시도해 보았고 두 번째 ImageColorAllocate에서 실패한 것으로 보입니다. 내가 검색 할 때 Google에 아무런 언급이 없습니다. 호출 될 때 이미지를 렌더링 한 다음 파일 공간을 차지하지 않고 자체를 파괴한다고 가정합니다.


NXT를 사용하여 문제를 해결했습니다. 나는 공백을 두었습니다. 전에 간과 한

<?php 

.

+0

이것은 임의의 captcha 이미지를 생성하는 것입니까? – nickhar

+0

예. 그렇습니다. 나는 그것을 처음부터 모두 쓰고있다. – LmOtaku

+0

아직 데이터베이스에 글을 쓴 적이 없지만, 이것은 무작위 이미지를 보여주기위한 데모 코드입니다.일단 텍스트에서 무작위로 생성 된 이미지를 실제로 표시하는이 고비를 극복하면 보안에 대해 글을 쓸 것입니다. – LmOtaku

답변

1
imagepng($im,"new.png",0); 
imagedestroy($im); 

이 링크는 질문을 matchs ........ https://stackoverflow.com/questions/13619834/upload-png-image-with-transparency-code-but-it-not-working-and-also-showing-the/13621103#13621103-> 내가 그것을 작동 희망이 시도.

+0

아니요, 제 질문과 일치하지 않습니다. 이 코드는 작동했지만 이미지 파일을 로컬에 저장하고 있는데, 원하는 출력이 아니 었습니다. 호출 할 때 이미지를 렌더링 한 다음 파일 공간을 차지하지 않고 자체를 파괴한다고 가정합니다. – LmOtaku

+0

필자는 필자의 질문에 공간을 차지하지 않는다고 생각했다. 필자가 생각한 것처럼 코드가 어떻게 구조화 되었는가가 뻔뻔스럽지 않았기 때문이다. – LmOtaku

+0

코드가 실제로 결함이있는 GD를 설치했는지 여부를 판단하는 데 실제로 도움이 되었기 때문입니다. 내가 그것을 위해 사용한다는 의도가 아니더라도 투표 할 것입니다. lol – LmOtaku

1

약간의 변경으로 코드를 사용했는데 완벽하게 작동합니다.

내 변경 사항은 있었다 : 주위

  • 디버그 텍스트 라인을 제거 보안 문자 텍스트를 하드 코딩

    • (이것은있을 수없는 내가 가진 다른 .TTF로 글꼴 이름을 대체 그것은 화상) 파괴로
    • 함수 헤더() 라인
    ,691,363 주석
  • 호출 조정210

    여전히 문제가 발생하면 이미지 내용 만 출력하고 사용 가능한 텍스트 편집기에서 직접 스크립트 URL을 열어 소스 코드를 확인하십시오. 또한 출력에서 ​​선행 및 후행 공백이 없는지 확인하십시오.

    function createImgText($string=NULL, $fontsize=0, $marginX=0, $imgH=0, $fontfile=NULL, $imgColorHex=NULL, $txtColorHex=NULL){ 
        if($string != ""){ 
        header("Content-type: image/png");  
    
        $spacing = 0; 
    
        $line = array("linespacing" => $spacing); 
    
        if (file_exists($fontfile)) $box = @imageftbbox($fontsize,0,$fontfile,$string,$line) or die('Box command error'); 
        else die("ERROR - font"); 
    
        $tw=$box[4]-$box[0]; //image width 
        $marginY = $imgH - (($imgH - $fontsize)/2); 
        $imgWidth = $tw + (2*$marginX); 
        $im = ImageCreate($imgWidth, $imgH); 
        $int = hexdec($imgColorHex); 
        $arr = array("red" => 0xFF & ($int >> 0x10), 
         "green" => 0xFF & ($int >> 0x8), 
         "blue" => 0xFF & $int); 
        $black = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]); 
        $int = hexdec($txtColorHex); 
        $arr = array("red" => 0xFF & ($int >> 0x10), 
         "green" => 0xFF & ($int >> 0x8), 
         "blue" => 0xFF & $int); 
        $white = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]); 
        ImageFtText($im, $fontsize, 0, $marginX, $marginY, $white, $fontfile, $string, array()); 
        ImagePng($im); 
        ImageDestroy($im); 
    }else{ 
        echo "ERROR - no string"; 
    } 
    } 
    
    
    error_reporting(-1); 
    ini_set('display_errors', true); 
    $code = 'abcdef'; 
    
    createImgText($code, 9, 10, 18, 'MyFont.ttf', "000000", "FFFFFF"); 
    
  • +0

    도움을 주셔서 감사합니다. 필자는 문서 머리 부분에 흰 공백이없는 프레임 워크를 만들었고 그 내용을 확인했으며 "여분"은 출력되지 않았지만 파일 (captcha 출력 파일은 LmOtaku

    +0

    나는 당신을 투표 하겠지만, 분명히 충분한 담당자가 없습니다. 하지만 네, 때로는 자신의 서버/PHP 설치에서 코드를 테스트 할 사람이 필요합니다. 어떤 일이 일어나는지 확인해보십시오. 제대로 작동한다면 분명 내가 잘못한 것입니다. 이전에 화이트 스페이스 문제를 겪어 왔지만, 그렇게하지 않을 때 나는 불필요하다고 생각했지만, 때때로 멍청한 것들을 확인하는 것이 좋을 것 같습니다. – LmOtaku

    +0

    @LmOtaku 아무런 문제없이 도움이 되었기 때문에 기쁩니다 :) 텍스트 편집기를 사용하여 이미지를 디버깅하는 가장 좋은 방법을 찾았습니다. 그리고 StackOverflow에 오신 것을 환영합니다;) – NXT