Bir harici bağlantı bir minik seçimi

1 Cevap php

Sana bir link paylaşmak ve bu yazı ile ilişkili küçük resim seçebilirsiniz zaman Facebook yaptığı gibi, bir dış bağlantıdan küçük resim listesini alır bir senaryo oluşturmaya çalışıyorum.

Benim komut dosyası şu anda bu gibi çalışır:

  • file_get_contents URL
  • preg_match_all içeriğini herhangi bir <img src="" maç
  • Her görüntü için tam URL'yi çalışır ve bir dizide saklar
  • Varsa < 10 görüntü o aracılığıyla döngüler ve kullanımları getimagesize genişlik ve yükseklik bulmak için
  • > 10 görüntüler varsa bu döngüsü ve kullanımları fread ve imagecreatefromstring genişlik ve yükseklik (hız için) bulmak için
  • Bir kez tüm genişlik ve yükseklikleri ile döngüler ve sadece minimum genişlik ve yüksekliğe sahip yeni bir dizi görüntüleri ekler dışarı çalıştı (yani sadece Büyük Resim gösterilir, küçük resimler URL açıklayıcı olması olasılığı daha düşüktür)
  • Her görüntü yeni boyutlar dışarı çalıştı (oransal küçülttüm) ve döndü ...

<img src="'.$image[0].'" width="'.$image[1].'" height="'.$image[2].'"><br><br>

Şu anda bu çalışıyor, ama potansiyel olabilir sorunlar vardır:

  1. HIZ! URL sayfasında birçok görüntü varsa bu süreç daha uzun sürer
  2. BELLEK! Kullanımı getimagesize veya fread & imagecreatefromstring bellekte tüm görüntüyü saklar, sayfa üzerinde herhangi bir büyük görüntüler sunucunun bellek kadar yiyebilirim ve benim komut öldürmek (ve sunucu)

Ben buldum bir çözüm Ben sadece JPG adlı için bunu yapmak için bazı kod bulduk ama (o GIF desteklemek gerekir, tüm görüntüyü indirmek zorunda kalmadan görüntünün başlığındaki resim genişliğini ve yüksekliğini almak için güçlü olmak ve bir PNG).

Herkes Teşekkürler! ... Yukarıda belirtilen sorun, ya da belki de ben fikirlere açığım, bunu yapmanın başka bir yolu önermek ya bana yardım için herhangi bir telkinde bulunamaz

** Düzenleme: Aşağıdaki Kodu:

// Example images array
$images = array('http://blah.com/1.jpg', 'http://blah.com/2.jpg');

// Find the image sizes
$image_sizes = $this->image_sizes($images);

// Find the images that meet the minimum size
for ($i = 0; $i < count($image_sizes); $i++) {
    if ($image_sizes[$i][0] >= $min || $image_sizes[$i][1] >= $min) {                
        // Scale down the original image size
        $dimensions = $this->resize_dimensions($scale_width, $scale_height, $image_sizes[$i][0], $image_sizes[$i][1]);
        $img[] = array($images[$i], $dimensions['width'], $dimensions['height']);
    }
}

// Output the images
foreach ($img as $image) echo '<img src="'.$image[0].'" width="'.$image[1].'" height="'.$image[2].'"><br><br>';

/**
 * Retrieves the image sizes
 * Uses the getimagesize() function or the filesystem for speed increases
 */
public function image_sizes($images) {
    $out = array();
    if (count($images) < 10) {
        foreach ($images as $image) {
            list($width, $height) = @getimagesize($image);
            if (is_numeric($width) && is_numeric($height)) {
                $out[] = array($width, $height);
            }
            else {
                $out[] = array(0, 0);
            }
        }
    }
    else {
        foreach ($images as $image) {
            $handle = @fopen($image, "rb");
            $contents = "";
            if ($handle) {
                while(true) {
                    $data = fread($handle, 8192);
                    if (strlen($data) == 0) break;
                    $contents .= $data;
                }
                fclose($handle);
                $im = @imagecreatefromstring($contents);
                if ($im) {
                    $out[] = array(imagesx($im), imagesy($im));
                }
                else {
                    $out[] = array(0, 0);
                }
                @imagedestroy($im);
            }
            else {
                $out[] = array(0, 0);
            }
        }
    }
    return $out;
}

/**
 * Calculates restricted dimensions with a maximum of $goal_width by $goal_height 
 */
public function resize_dimensions($goal_width, $goal_height, $width, $height) {
    $return = array('width' => $width, 'height' => $height);

    // If the ratio > goal ratio and the width > goal width resize down to goal width
    if ($width/$height > $goal_width/$goal_height && $width > $goal_width) {
        $return['width'] = floor($goal_width);
        $return['height'] = floor($goal_width/$width * $height);
    }

    // Otherwise, if the height > goal, resize down to goal height
    else if ($height > $goal_height) {
        $return['width'] = floor($goal_height/$height * $width);
        $return['height'] = floor($goal_height);
    }   
    return $return;
}

1 Cevap

(Etkileyici) mevcut yaklaşım için akla gelen tek fikir, mevcut genişlik ve yükseklik nitelikleri için HTML kontrol ve varsa tamamen dosya okumak sürecini atlamak etmektir.