개발 꿀팁/PHP

PHP로 명령줄에서 그림 보기

Jammie 2022. 8. 9. 13:01
반응형

인터넷에서 사진을 많이 찾거나, 때로는 리눅스 서버에 원격으로 접속해 수집한 사진을 보고 싶을 때 ftp로 파일을 다운받아 보는 경우도 있다.

번거롭지만 명령어 아래에서는 확실히 뷰어 앱을 사용할 수 없어서 이 코드를 찾아 글자로 그림을 보여준다.

이제 더 이상 다운로드를 받지 않고도 사진의 대략적인 상황을 그대로 느낄 수 있어 편리해졌다.

<?php
function asciifyImage($img,$asciiscale,$asciicolor,$asciialpha,$asciiblock,$asciiinvert,$asciiresolution,$asciichars){
    $strChars = "";
    $strFont = "courier new";
    $aDefaultCharList = str_split(" .,:;i1tfLCG08@");
    $aDefaultColorCharList = str_split(" CGO08@");
    $iScale = $asciiscale?$asciiscale:1;
    $bColor = $asciicolor;
    $bAlpha = $asciialpha;
    $bBlock = $asciiblock;
    $bInvert = $asciiinvert;
    $strResolution = $asciiresolution?$asciiresolution:"low";
    $aCharList = $asciichars?$asciichars:($bColor ? $aDefaultColorCharList : $aDefaultCharList);
    $fResolution = 0.5;
    switch ($strResolution) {
        case "low" :     $fResolution = 0.25; break;
        case "medium" : $fResolution = 0.5; break;
        case "high" :     $fResolution = 1; break;
    }
    $im = imagecreatefromjpeg($img);
     $iWidth = ceil(imagesx($im) * $fResolution);
    $iHeight = ceil(imagesy($im) * $fResolution);
    for($y=0;$y<$iHeight;$y+=2){
        for($x=0;$x<$iWidth;$x++){
            $color_index = imagecolorsforindex($im,imagecolorat($im, ceil($x/$fResolution), ceil($y/$fResolution)));
            $iRed = $color_index['red'];
            $iGreen = $color_index['green'];
            $iBlue = $color_index['blue'];
            $iAlpha = $color_index['alpha'];
            if ($iAlpha == 100) {
                $iCharIdx = 0;
            } else {
                $fBrightness = (0.3*$iRed + 0.59*$iGreen + 0.11*$iBlue) / 255;
                $iCharIdx = (count($aCharList)-1) - ceil($fBrightness * (count($aCharList)-1));
            }
            if ($bInvert) {
                $iCharIdx = (count($aCharList)-1) - $iCharIdx;
            }
            $strThisChar = $aCharList[$iCharIdx];
            if ($strThisChar == " ") 
                $strThisChar = " ";
            if ($bColor) {
                $strChars .= "<span style='"
                    . "color:rgb($iRed,$iGreen,$iBlue);"
                    . ($bBlock ? "background-color:rgb($iRed,$iGreen,$iBlue);" : "")
                    . ($bAlpha ? "opacity:" . ($iAlpha/255) . ";" : "")
                    . "'>" . $strThisChar . "</span>";
            } else {
                $strChars .= $strThisChar;
            }
        }
        $strChars .= "\r\n";
    }
    $fFontSize = (2/$fResolution)*$iScale;
    $fLineHeight = (2/$fResolution)*$iScale;
    $fLetterSpacing = 0;
    if ($strResolution == "low") {
        switch ($iScale) {
            case 1 : $fLetterSpacing = -1; break;
            case 2 : 
            case 3 : $fLetterSpacing = -2.1; break;
            case 4 : $fLetterSpacing = -3.1; break;
            case 5 : $fLetterSpacing = -4.15; break;
        }
    }
    if ($strResolution == "medium") {
        switch ($iScale) {
            case 1 : $fLetterSpacing = 0; break;
            case 2 : $fLetterSpacing = -1; break;
            case 3 : $fLetterSpacing = -1.04; break;
            case 4 : 
            case 5 : $fLetterSpacing = -2.1; break;
        }
    }
    if ($strResolution == "high") {
        switch ($iScale) {
            case 1 : 
            case 2 : $fLetterSpacing = 0; break;
            case 3 : 
            case 4 : 
            case 5 : $fLetterSpacing = -1; break;
        }
    }
    $width = ceil($iWidth/$fResolution)*$iScale;
    $height = ceil($iHeight/$fResolution)*$iScale;
    $style = "display:inline;width:$width px;height:$height px;white-space:pre;margin:0px;padding:0px;font:$strFont";
    $style .= "letter-spacing:$fLetterSpacing px;font-size:$fFontSize px;text-align:left;text-decoration:none";
    echo  $strChars;
}
if( $argc<=1 ){
    $fs = true; 
    do{
        if($fs){
            fwrite(STDOUT,'그림 파일 이름을 입력하십시오:');
            $fs = false;
        }else{
            fwrite(STDOUT,'죄송합니다, 이미지 파일 이름은 비워둘 수 없습니다. 이미지 파일 이름을 다시 입력하십시오:');
        }     
        $filename = trim(fgets(STDIN)); 
    }while(!$filename);
    $px            =    1;
}else{
    $filename    =    $argv[1];
    $px            =    isset($argv[2]) ? $argv[2] : 1;
}
switch($px){
    case 1:    $pxval    =    'low';break;
    case 2: $pxval    =    'medium';break;
    case 3: $pxval    =    'high';break;
}
asciifyImage($filename, 3, false, 0, false, false, $pxval, null);

viewImg.php와 같은 php 파일로 저장합니다.

나중에 그림을 보려면 명령줄을 직접 사용하십시오(파일 경로 주의):

php -f viewImg.php  yourPhoto.jpg  1

마지막 파라미터 값 1:low Low Low 2:medium 중청 3:high High(이미지가 너무 크면 잘 보이지 않을 수 있습니다.

문자로 구성된 이미지, 마음을 써야 그 내면을 느낄 수 있습니다 - :)

 

반응형