Загрузить больше изображений на прокрутке (без mysql) - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть этот php-код, который автоматически переключает мои фотографии в галерею:

<?php
$folder = "../albums/1000/";
$folder3 = "albums/1000/";
$handle = opendir($folder);
$noeffect = "noeffect";
while (false !== ($file = readdir($handle))) { 
                if (strpos($file, '.png',1)||strpos($file, '.jpg',1)||strpos($file, '.JPG',1) ) { 
$imgsrc= "../thumbnail.php?file=";
$imgend= "&width=120&height=120";
    echo ("
    <li><a href=\"".$folder.$file."\" rel=\"".$rel.external."\" class=\"".$noeffect."\">
 <img src=\"".$imgsrc.$folder3.$file.$imgend."\" /></a></li> "); }}
?>

это прекрасно работает, и мне это нравится! но когда я загружаю 200-300 картинок, ему нужно загрузить большие пальцы, прежде чем он сможет просмотреть большую картинку в галерее ... и я подумал, как сделать кнопку "Загрузить больше" или больше при прокрутке, чтобы загружать как 30 картинок за раз ... Я искал в сети и перепробовал многие, но большинство из них используют mysql, и я не знаю, как с этим справиться, а другие были проблематичны ... любое решение? спасибо!

Вы можете посмотреть, например, что я делаю: http://m.eladhamemagnet.net/albums/996.php

Кстати, это для iphone, поэтому мне нужно, чтобы он быстро загружался

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Вы можете использовать библиотеку изображений, чтобы объединить все миниатюры в одно большое изображение, а затем использовать позиционирование CSS, чтобы отобразить каждый из них в отдельном элементе.

Таким образом, браузер загружает только одно изображение.Все миниатюры появляются одновременно, но если у вас есть сотни изображений, вы можете разбить их на более мелкие группы, чтобы спрайт не был слишком большим файлом.

    <?php
$images_dir = './images';
$thumb_height = $thumb_width = $sprite_width = 120;

// List the images to process
$sprite_exists = false;
$list = array();
if ($handle = opendir($images_dir)) {
    while (false !== ($filename = readdir($handle))) {
        if ($filename == "sprite.jpg") { $sprite_exists = true; break;}
        $fpath = $images_dir.'/'.$filename;
        if (exif_imagetype($fpath)      == IMAGETYPE_GIF)  { $list[] = $fpath; }
        else if (exif_imagetype($fpath) == IMAGETYPE_JPEG) { $list[] = $fpath; }
        else if (exif_imagetype($fpath) == IMAGETYPE_PNG)  { $list[] = $fpath; }
    }
    closedir($handle);
}
// Create a sprite image of all thumbnails
if ( ! $sprite_exists) {
    $sprite_height = $thumb_height * (count($list));
    // create the large sprite
    $sprite = imagecreatetruecolor($sprite_width, $sprite_height);
    // Set the background
    $black = imagecolorallocate($sprite, 0, 0, 0);
    imagefill($sprite, 0, 0, $black);
    $i = 0;
    foreach($list as $fpath){
        list($width_orig, $height_orig) = getimagesize($fpath);
        if (exif_imagetype($fpath)      == IMAGETYPE_GIF)  { $source = imagecreatefromgif ($fpath); }
        else if (exif_imagetype($fpath) == IMAGETYPE_JPEG) { $source = imagecreatefromjpeg($fpath); }
        else if (exif_imagetype($fpath) == IMAGETYPE_PNG)  { $source = imagecreatefrompng ($fpath); }
        $horizontal_position = 0;
        $vertical_position = $thumb_height * $i;
        $ratio_orig = $width_orig/$height_orig;
        if ($ratio_orig > 1) {
            // Landscape
            $new_width  = $thumb_width;
            $new_height = intval($thumb_height / $ratio_orig);
            $vert_offset = intval(($thumb_height - $new_height)/2);
            $vertical_position += $vert_offset;
        } else if ($ratio_orig < 1) {
           // Portrait
            $new_width  = intval($thumb_width * $ratio_orig);
            $new_height = $thumb_height;
            $horiz_offset = intval(($thumb_width - $new_width)/2);
            $horizontal_position += $horiz_offset;
        } else {
           // Square
            $new_width  = $thumb_width;
            $new_height = $thumb_height;
        }
        imagecopyresampled($sprite, $source, $horizontal_position, $vertical_position, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
        $i++;
    }
    // Output and free from memory
    //imagejpeg($sprite, './images/sprite.jpg');
    imagejpeg($sprite, './sprite.jpg');
    imagedestroy($sprite);
}

// Generate the HTML to display thumbs from the sprite
$html = '<html><head><style type="text/css">.thumb{border:1px solid silver;height:'.$thumb_height.'px;width:'.$thumb_width.'px;
background-image:url(sprite.jpg);background-position: 0 -20px;display:inline-block;}</style></head><body>';
$i = 0;
foreach($list as $fpath){
    $vertical_offset = $thumb_height * $i;
    $thumb = '<a href="'.$fpath.'" class="thumb" style="background-position: 0 -'.$vertical_offset.'px">&nbsp;</a>';
    $html .= $thumb;
    $i++;
}
$html .= '</body></html>';
file_put_contents('thumbs.html',$html)
?>
1 голос
/ 18 сентября 2011

Сначала используйте javascript, чтобы начать предварительную загрузку большого изображения в DOM ready.Это убедится, что большие пальцы загружаются первыми.Когда большие пальцы будут загружены, начните загружать "большие картинки" через javascript.Это приведет к тому, что большие изображения будут кэшироваться браузером и отображаться мгновенно.

Во-вторых, браузеры будут открывать только 8 соединений одновременно с любым доменом.Старые браузеры используют меньше.Это означает, что с 30 картинками потребуется 4 "раунда" грузов, чтобы получить все.Это не относится к файлам html, css и javascript.Невозможно загрузить 30 изображений одновременно.Если вы можете настроить субдомены и назначить изображения для загрузки с каждого субдомена, ваши изображения будут загружаться с той скоростью, с которой может справиться пользовательское соединение.Или ваш сервер может служить.Вы хотите, чтобы каждое изображение всегда загружалось с одного и того же поддоменов, чтобы браузер кэшировал его между загрузками страниц.

В качестве примера вы можете видеть, как быстро загружается полная страница с большими пальцами на сайте Iуправлять (бесстыдная вилка) bigstockphoto.com.Как только страница закончит загрузку, javascript / ajax начнет загружать большие «зависшие» изображения.Если для изображения на странице установлено значение 160, на страницу загружается более 320 изображений (160 больших пальцев + 160 больших изображений).

0 голосов
/ 20 сентября 2011

Я делал предварительную загрузку для каждой картинки, и она работала ..

...