Autor Zpráva
4li1985
Profil
Zdravím.

Prosím o pomoc.

Mám skript, ktorý mi hromadne sťahuje veľké množstvo obrázkov z rôznych webov a následne zmení ich velkosť. Problém je, že niektoré takto spracované obrázky sú "scrambled".

Skript:

/*
 * PHP function to resize an image maintaining aspect ratio
 * http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html
 *
 * Creates a resized (e.g. thumbnail, small, medium, large)
 * version of an image file and saves it as another file
 */

define('THUMBNAIL_IMAGE_MAX_WIDTH', 260);
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 520);

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
{
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
    switch ($source_image_type) {
        case IMAGETYPE_GIF:
            $source_gd_image = imagecreatefromgif($source_image_path);
            break;
        case IMAGETYPE_JPEG:
            $source_gd_image = imagecreatefromjpeg($source_image_path);
            break;
        case IMAGETYPE_PNG:
            $source_gd_image = imagecreatefrompng($source_image_path);
            break;
    }
    if ($source_gd_image === false) {
        return false;
    }
    $source_aspect_ratio = $source_image_width / $source_image_height;
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
        $thumbnail_image_width = $source_image_width;
        $thumbnail_image_height = $source_image_height;
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
        $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
        $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
    } else {
        $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH;
        $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
    }
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);
    imagejpeg($thumbnail_gd_image, $thumbnail_image_path, 100);
    imagedestroy($source_gd_image);
    imagedestroy($thumbnail_gd_image);
    return true;
}


$r_updates = mysqli_query($connect, "SELECT * FROM updates");
while($updates = mysqli_fetch_array($r_updates)) {
    $file_url = $_SERVER["DOCUMENT_ROOT"] . ('/images/updates/'. $updates['id'] .'.jpg');
    $thumbnail_url = $updates['thumbnail_url'];
    
    copy($thumbnail_url, $file_url);
    generate_image_thumbnail($file_url, $file_url);
}

Viete mi poradiť? Ďakujem.
Keeehi
Profil
4li1985:
Ten obrázek není dostupný. Vidíme jen, že stránka kde by měl být nahraný je v rekonstrukci.
NoxOne
Profil
Já bych to viděl na problém se stažením obrázku. Pokud jich taháš hodně tak bych na to použil WGET a teprve potom bych je lokálně zpracoval. Z tvého scriptu nevidím jak ty obrázky stahuješ.

Správný postup by byl :
najít obrázek
stáhnout do dočasné složky
upravit jak potřebuješ
uložit kam chceš
smazat dočasný obrázek
4li1985
Profil
Keeehi:
Bolo to dočasne nedostupné. Už by mal byť vidieť.
Nie všetky obrázky takto dopadnú. Len niektoré, ostatné sú OK.

NoxOne:
Obrázky sťahujem pomocou funkcie copy()

    copy($thumbnail_url, $file_url);
    generate_image_thumbnail($file_url, $file_url);
Keeehi
Profil
4li1985:
Nejsem na tohle expert, ale zdá se mi, že tohle by mohlo vzniknout, pokud se obrázku stáhne třeba jen půlka dat. První věcí co bych zkontroloval tedy je, zda vůbec jsou ty vstupní obrázky v pořádku.
NoxOne
Profil
4li1985:
Funkcí copy stahuješ obrázky z jiných serverů ? To je šílený. Přesně jak jsem psal a "Keeehi" ti to píše taky. Překontroluj si zda jsou zdrojové/stažené obrázky v pořádku.

Pokud ne tak musíš stahovat něčím co počítá s možností přerušení stahování.
WGET nebo CuRL postup jak bych to dělal já jsem ti už napsal.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0