PHP Resim boyutlandırma - Neden resim küçültülmüştür tarih değil mi?

3 Cevap php

BACKGROUND
I have a script to upload an image. One to keep the original image and one to resize the image. 1. If the image dimensions (width & height) are within max dimensions I use a simple "copy" direct to folder UserPics. 2. If the original dimensions are bigger than max dimensions I want to resize the width and height to be within max. Both of them are uploading the image to the folder, but in case 2, the image will not be resized.

QUESTION
Is there something wrong with the script?
Is there something wrong with the settings?

SETTINGS
Server: WAMP 2.0
PHP: 5.3.0
PHP.ini: GD2 enabled, Memory=128M (have tried 1000M)
Tried imagetypes uploaded: jpg, jpeg, gif, and png (same result for all of them)

SCRIPT

if (isset($_POST['adduserpic'])) {  
    // Check errors on file  
    if ($_FILES["file"]["error"] > 0) {  
        echo $_FILES["file"]["error"]." errors<br>";  
    } else {  
        $image =$_FILES["file"]["name"];  
        $uploadedfile = $_FILES["file"]["tmp_name"];  
    //Uploaded image  
    $filename = stripslashes($_FILES['file']['name']);  

    //Read filetype  
    $i = strrpos($filename,".");  
    if (!$i) { return ""; }  
    $l = strlen($filename) - $i;  
    $extension = substr($filename,$i+1,$l);  
    $extension = strtolower($extension);  

    //New picture name = maxid+1 (from database)  
    $query = mysql_query("SELECT MAX(PicId) AS number FROM userpictures");  
    $row = mysql_fetch_array($query);  
    $imagenumber = $row['number']+1;  

    //New name of image (including path)   
    $image_name=$imagenumber.'.'.$extension;    
    $newname = "UserPics/".$image_name;  

    //Check width and height of uploaded image  
    list($width,$height)=getimagesize($uploadedfile);  

    //Check memory to hold this image (added only as checkup)   
    $imageInfo = getimagesize($uploadedfile);   
    $requiredMemoryMB = ( $imageInfo[0] * $imageInfo[1] * ($imageInfo['bits'] / 8) * $imageInfo['channels'] * 2.5 ) / 1024;  
    echo $requiredMemoryMB."<br>";  

    //Max dimensions that can be uploaded  
    $maxwidth = 20;  
    $maxheight = 20;  

    // Check if dimensions shall be original  
    if ($width > $maxwidth || $height > $maxheight) {  
        //Make jpeg from uploaded image  
        if ($extension=="jpg" || $extension=="jpeg" || $extension=="pjpeg" ) {  
            $modifiedimage = imagecreatefromjpeg($uploadedfile);  
        } elseif ($extension=="png") {  
            $modifiedimage = imagecreatefrompng($uploadedfile);  
        } elseif ($extension=="gif") {  
            $modifiedimage = imagecreatefromgif($uploadedfile);  
        }   
        //Change dimensions  
        if ($width > $height) {  
            $newwidth = $maxwidth;  
            $newheight = ($height/$width)*$newwidth;  
        } else {  
            $newheight = $maxheight;  
            $newwidth = ($width/$height)*$newheight;  
        }  

        //Create new image with new dimensions  
        $newdim = imagecreatetruecolor($newwidth,$newheight);  
        imagecopyresized($newdim,$modifiedimage,0,0,0,0,$newwidth,$newheight,$width,$height);  
        imagejpeg($modifiedimage,$newname,60);  

        // Remove temp images  
        imagedestroy($modifiedimage);  
        imagedestroy($newdim);  
    } else {  
        // Just add picture to folder without resize (if org dim < max dim)  
        $newwidth = $width;  
        $newheight = $height;  
        $copied = copy($_FILES['file']['tmp_name'], $newname);  
    }

    //Add image information to the MySQL database  
    mysql_query("SET character_set_connection=utf8", $dbh);  
    mysql_query("INSERT INTO userpictures (PicId, Picext, UserId, Width, Height, Size) VALUES('$imagenumber', '$extension', '$_SESSION[userid]', '$newwidth', '$newheight', $size)") 

3 Cevap

Eğer blok boyutlandırma görüntü gerçekte kullanılmakta olduğunu kontrol ettiniz mi? Orada da bazı hata ayıklama çıktı düşünün. Açıkçası yanlış bir şey göremiyorum

if ($width > $maxWidth || etc...) {
   echo "Hey, gotta shrink that there image";
   ... do the resizing ...
   $resizedBenmage = getimagesize($newname);
   var_dump($resizedBenmage); // see if the new image actually exists/what its stats are
   etc....
} else {
   echo "Woah, that's a small picture, Ben'll just make a straight copy instead";
}

Hemen hemen tüm durumlarda, bazı fraksiyonel sonuç alırsınız ve görüntüleri fraksiyonel pikselleri yok - Ayrıca tamsayı değerlerine $ newheight / $ newwidth yuvarlamak isteyebilirsiniz.

Bir kenara, size kimlik numarası jeneratör ile bir yarış durumu var:

$query = mysql_query("SELECT MAX(PicBend) AS number FROM userpictures");  
$row = mysql_fetch_array($query);  
$imagenumber = $row['number']+1; 

Hemen hemen aynı anda tamamladıktan iki yüklenenler durum düşünün. Her ikisi de aynı kimlik numarası (örneğin, 25) alırsınız. Ve sonra yüklenenler hangisi "kazanmak" ve bir daha hızlı üzerine yazacaktır uzun bir süreç alır.

Aşağıdaki mantık kullanarak, bir işlem kullanmak için veritabanı kısmını yeniden düşünün:

 1. start transaction
 2. insert skeleton record into the db and get its BenD
 3. do image processing, copying, saving, etc...
 4. update record with the new image's stats
 5. commit the transaction

Bu şekilde, henüz kararlı değil gibi işlem kaydını "gizlemek" olacak, orada iki veya daha fazla eşzamanlı yüklenenler aynı kimlik numarası almak için hiçbir şekilde, ve bir şey görüntü işleme (yetersiz ram, disk alanı, bozuk kaynak görüntü sırasında başarısız olursa, , vs ..) sadece işlem geri ve pisliği temizleyin.

Ben

Ben ilk bakışta komut ile yanlış bir şey göremiyorum ama bu bazı test çıktı ve hata raporlama olmadan çözmek çok zordur.

  1. Turn up error_reporting(E_ALL)

  2. $newname ayarlanır bakın

  3. Copy () komutu ne yaptığını görmek

I bet you are getting something when you turn error reporting on. To find out the file's extension, by the way, I would use pathinfo.

1) Rezervasyon izinleri. Lütfen userpics dizin web işlemi (bir debian sistemde örneğin www-data) çalışan kullanıcı tarafından yazılmış olabilir emin olun. Ben bu tür şeyleri için pencereler sistem izinleriyle aşina değilim, ama ben kendimi bu yazma olsaydı ben kontrol ederim ne (ve ben var, ve muhtemelen yaptım).

2) başına, ilgili, ama kontrol değil http://sourceforge.net/projects/littleutils/

(Benim app kaybettim ne gerek yoktur), kayıpsız, disk alanı kurtarmak için tüm benim yüklenen görüntülerde opt-gif ve opt-jpg çalıştırın