3

サムネイルを作ってみました。そして、php関数が動作します。それを使ってサムネイルを作りました。ただし、特定のファイルは機能しません。問題を絞り込みましたが、今は立ち往生しています。どんな助けでも大歓迎です。

画像はhttp://www.pspsigma.com/image_test.phpにあります。左側のものは動作しません。右の人がそうします。どちらも.jpgです。どちらも元々はフォーム経由でアップロードされていましたが、関数がフォームなしで機能するようにスタック オーバーフローのために変更されています。

html は、この .php ファイルへのファイル入力セット アクションを含む単純なスクリプトです。

PHP:

<?php
    $the_name= $_FILES['userfile']['name']; 
    $tmpname = $_FILES['userfile']['tmp_name'];  



    $size="1000";
      $save_dir="images/thumbs/";
      $save_name=$the_name;
      $maxisheight= "100";

function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight)
{
$save_dir     .= ( substr($save_dir,-1) != "/") ? "/" : "";
$gis        = getimagesize($tmpname);
$type        = $gis[2];
switch($type)
    {
    case "1": $imorig = imagecreatefromgif($tmpname); break;
    case "2": $imorig = imagecreatefromjpeg($tmpname);break;
    case "3": $imorig = imagecreatefrompng($tmpname); break;
    default:  $imorig = imagecreatefromjpeg($tmpname);
    }

    //check if imorig is set
    if (!isset($imorig)) {
    echo " imorig is not set, ";    
    }

    //I tried setting $x and $y from the width and height of the original file. Still didn't work.
    //although the variables were set.
    //this makes me think the problem is with the imagecreatefromjpeg function.
    list($width, $height, $type, $attr) = getimagesize($tmpname);
    echo "getimagesize width= " . $width . ", ";
    echo "getimagesize height= " . $height . ", ";

    //possible solution, didn't work
    //$x = $width;
    //$y = $height;

    //This is the problem
    $x = imagesx($imorig);
    $y = imagesy($imorig);

    //check that x and y are set
    if (!isset($x) && !isset($y)) {
        echo" x and y are not set,";
    }
    elseif (!isset($x)) {
        echo" x is not set";
    }
    elseif (!isset($y)) {
        echo" y is not set";
    }
    else {
    echo "|x= " . $x . " |";
    echo "|y= " . $y . " |";            
    }


    $woh = (!$maxisheight)? $gis[0] : $gis[1] ;   


    if($woh <= $size)
    {
    $aw = $x;
    $ah = $y;
    }
        else
    {
        if(!$maxisheight){
            $aw = $size;
            $ah = $size * $y / $x;
        } else {
            $aw = $size * $x / $y;
            $ah = $size;
        }
    }   
    $im = imagecreatetruecolor($aw,$ah);
    if (!$im) {
        echo " failure: no im variable. ";
    }
    else {

if (imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y)) {
    if (!imagejpeg($im, $save_dir.$save_name)) {
        echo "failure";}
        else {
        echo "success";}
}
else {
    echo" didn't copy resampled";
}
    }
}


img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight);
?>

rush vader.jpg ファイルを選択して、この関数に通すとします。x と y が設定されていることをエコーし​​、それらの値と成功を表示します。

Calm.jpg を選択すると、「失敗: im 変数がありません」というメッセージが表示されます。$x および $y 変数には値がありません。x 変数と y 変数に getimagesize($tmp_name) の値を割り当てると、「リサンプリングされたものをコピーしませんでした」と表示されます。

これは実際の画像の問題ですか?または、すべての画像が機能するようにコードを変更する方法はありますか?

ありがとうございました!!!

アップデート

すべての変数をエコーし​​て、何かがおかしいかどうかを確認しました。問題はタイプにあるようです。タイプは 6 として出力されますが、PHP のマニュアル コメントからわかったのは bmp です。

拡張子が .jpg の場合、それがどのようになるのかわかりません... これが当てはまる場合。タイプを.jpg、.png、または.gifのいずれかに変更する方法はありますか?

4

1 に答える 1

2

画像の Calm.jpg のタイプは 6 で、これは bmp です。したがって、imagecreatefrom... は機能せず、$imorig は NULL です。ラベル 6 で imagecreatefrombmp と呼ばれる php マニュアルから関数を追加することによって。関数は完全に動作します。

ファイルに追加します。

function imagecreatefrombmp($p_sFile)  { 
    //    Load the image into a string 
    $file    =    fopen($p_sFile,"rb"); 
    $read    =    fread($file,10); 
    while(!feof($file)&&($read<>"")) 
        $read    .=    fread($file,1024); 

    $temp    =    unpack("H*",$read); 
    $hex    =    $temp[1]; 
    $header    =    substr($hex,0,108); 

    //    Process the header 
    //    Structure: http://www.fastgraph.com/help/bmp_header_format.html 
    if (substr($header,0,4)=="424d") 
    { 
        //    Cut it in parts of 2 bytes 
        $header_parts    =    str_split($header,2); 

        //    Get the width        4 bytes 
        $width            =    hexdec($header_parts[19].$header_parts[18]); 

        //    Get the height        4 bytes 
        $height            =    hexdec($header_parts[23].$header_parts[22]); 

         //    Get the horz. resolution in pixel per meter, 4 bytes
        $dpix = hexdec($header_parts[39]. $header_parts[38]) * 0.0254;

        //    Get the vert. resolution in pixel per meter, 4 bytes
        $dpiy = hexdec($header_parts[43]. $header_parts[42]) * 0.0254;

        //    Unset the header params 
        unset($header_parts); 
    } 

    //    Define starting X and Y 
    $x                =    0; 
    $y                =    1; 

    //    Create newimage 
    $image            =    imagecreatetruecolor($width,$height); 

    //    Grab the body from the image 
    $body            =    substr($hex,108); 

    //    Calculate if padding at the end-line is needed 
    //    Divided by two to keep overview. 
    //    1 byte = 2 HEX-chars 
    $body_size        =    (strlen($body)/2); 
    $header_size    =    ($width*$height); 

    //    Use end-line padding? Only when needed 
    $usePadding        =    ($body_size>($header_size*3)+4); 

    //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
    //    Calculate the next DWORD-position in the body 
    for ($i=0;$i<$body_size;$i+=3) 
    { 
        //    Calculate line-ending and padding 
        if ($x>=$width) 
        { 
            //    If padding needed, ignore image-padding 
            //    Shift i to the ending of the current 32-bit-block 
            if ($usePadding) 
                $i    +=    $width%4; 

            //    Reset horizontal position 
            $x    =    0; 

            //    Raise the height-position (bottom-up) 
            $y++; 

            //    Reached the image-height? Break the for-loop 
            if ($y>$height) 
                break; 
        } 

        //    Calculation of the RGB-pixel (defined as BGR in image-data) 
        //    Define $i_pos as absolute position in the body 
        $i_pos    =    $i*2; 
        $r        =    hexdec($body[$i_pos+4].$body[$i_pos+5]); 
        $g        =    hexdec($body[$i_pos+2].$body[$i_pos+3]); 
        $b        =    hexdec($body[$i_pos].$body[$i_pos+1]); 

        //    Calculate and draw the pixel 
        $color    =    imagecolorallocate($image,$r,$g,$b); 
        imagesetpixel($image,$x,$height-$y,$color); 

        //    Raise the horizontal position 
        $x++; 
    } 

    //    Unset the body / free the memory 
    unset($body); 

    //    Return image-object 
    return ($image); 
    return ($dpix); 
    return ($dpiy); 
} 

追加:

case "6": $imorig = imagecreatefrombmp($tmpname); break;
case "15": $imorig = imagecreatefromwbmp($tmpname); break;

case "3": $imorig = imagecreatefrompng($tmpname); break;

テスト済み。そしてすべてが機能します。皆さんありがとう!

于 2013-01-25T02:06:26.093 に答える