krose
krose

Reputation: 410

imagesx() and imagesy() not working

I am trying to make a thumbnail. And the php function works. I've made thumbnails with it. However, certain files do not work. I have narrowed down the problem, but am now stuck. Any help would be appreciated.

The images can be found at http://www.pspsigma.com/image_test.php .The one on the left will not work. The one on the right will. Both are .jpg. Both are originally uploaded via a form, but have been altered for stack overflow so that the function works without a form.

The html is a simple script with file input set action to this .php file

the 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);
?>

If I choose the rush vader.jpg file and put it through this function. it echo's that x and y are set, displays their values ,and success.

If I choose the calm.jpg it will echo "failure: no im variable." and the $x and $y variables will not have values. If I assign the x and y variables the values from getimagesize($tmp_name) it echoes "didn't copy resampled".

Is this a problem with the actual image? or is there some way I can change the code so that every image works?

THANK YOU!!!

UPDATE

I echo'd every variable to see if something was off. The problem appears to be in the type. The type is output as 6 which from the php manual comments i found out is bmp.

I don't understand how that could be if the extension is .jpg... If this is the case. Is a way to change the type to make it either .jpg, .png, or .gif?

Upvotes: 3

Views: 7345

Answers (1)

krose
krose

Reputation: 410

The type from the image calm.jpg is 6 which is a bmp. Therefore the imagecreatefrom... will not work and $imorig is NULL. By adding a function from the php manual called imagecreatefrombmp with label 6. The function works perfecty.

Add to the file:

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); 
} 

add:

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

after

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

Tested. and everything works. Thanks all!

Upvotes: 2

Related Questions