Nasıl bir CodeIgniter PHP uygulamalarında resim boyutlandırma hızlandırmak için?

2 Cevap php

Kullanıcıların resim yüklemek için izin veren bir uygulama var. Kullandığım test durumda ölçüleri 3872 x 2592px ile 1.6MB bir jpeg olduğunu. Arka-uç yükleme komut 6 ek biçimleri içine yüklenen görüntüyü yeniden boyutlandırmak olacaktır:

  • kare (küçük 75 x 75)
  • Küçük BAŞPARMAĞI (50 x 38)
  • Thumb (100 x 76)
  • Küçük (240 x 161)
  • Orta (500 x 378)
  • Büyük (774 x 1024)

Ben çok biliyorum ama inan bana, buna ihtiyacım var. Ben GD, GD2 veya ImageMagick ya boyutlandırma yapmak için kullandığı Kod ateşleyici adlı Görüntü İşleme sınıfını kullanarak yeniden boyutlandırma yapmak. Ben ilk GD2 kullanmak üzere yapılandırılmış ve toplam boyutlandırma işlemi 11 saniye sürer fark ettim.

Kullanıcı bu işlemi için beklemek zorunda olduğu için, bu kabul edilebilir değildir. Okuma bir sürü sonra Ben ImageMagick çok daha hızlı ve verimli bir manipülasyon kütüphane, yani ben buna açık olduğunu öğrendim:

$sourceimage = $data['filedata']['file_path'] . $data['imagedata']['user_id'] . "/" . $imageid . $data['filedata']['file_ext'];
$resize_settings['image_library'] = 'imagemagick';
$resize_settings['library_path'] = '/usr/bin';
$resize_settings['source_image'] = $sourceimage;
$resize_settings['maintain_ratio'] = false;
$resize_settings['quality'] = "100%";
$this->load->library('image_lib', $resize_settings);

Çok benim sürpriz, yeniden boyutlandırma işlemi artık daha uzun sürer: 15 secs belirli olması.

Benim günlüğünde bakmak zorunda ben her eylem olursa olsun, kendisine yeniden boyutlandırma dosya biçimini 2 saniye sürer yeniden boyutlandırmak görüyoruz. Ben her zaman çok büyük orijinal, yeniden boyutlandırma, çünkü bu sanırım.

Bu sitenin kullanılabilirliğini azaltmak çünkü ben, zamanlanmış bir süreç yeniden boyutlandırma işlemini boşaltması için nefret ediyorum. Bu kullanıcılar görüntü ile çalışan / görmeye başlamadan önce bir kaç dakika beklemek zorunda anlamına gelecektir.

So, are there any smart ways to dramatically speed up this resizing process so that I can keep it in real-time? Just be clear: allowing for smaller resolutions is not an option, this is a photography site I'm building. Also, I really need the six formats mentioned.

2 Cevap

Bir fikir olarak, daha mantıklı bir ara boyutuna yüklenen boyutu yeniden boyutlandırmak verebilir ve daha sonra operasyonlar için temel olarak kullanabilirsiniz.

Alternatif olarak, ImageMagick'in komut satırı sürümü için dışarı exec ve http://stackoverflow.com/questions/222414/asynchronous-shell-exec-in-php içinde açıklanan işlem kullanılarak arka planda görüntü dönüşümleri (en azından bir kısmını) yürütmek olabilir.

Biraz konu dışı bulunuyor ederken Son olarak, dikey yönlendirme için izin gidiyor, ya da bu bir faktör olması muhtemel değildir vardır?

Zaten bir yanıt kabul ama edeceğim hala benim sonrası var gibi görünüyor.

Her şeyden önce, gerçekten, kaliteli bir 90% veya işleme süresini ve görüntü azaltırken 85% değeri sadece iyi yapacağız 100% kullanmak gerekmez boyutu (inanmıyorum eğer bana sadece bazı testler).

Ayrıca this image ile bazı kriterleri yapılan ve özel bir JPEG() işlevi, first test case: ettik

JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./original.jpg', null, '500*378', './output/medium.jpg');
JPEG('./original.jpg', null, '240*161', './output/small.jpg');
JPEG('./original.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./original.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./original.jpg', null, '75*75', './output/square.jpg');

Bu benim yavaş slow bilgisayarda 60 saniye ortalama alır.


Second test case:

JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./output/large.jpg', null, '500*378', './output/medium.jpg');
JPEG('./output/medium.jpg', null, '240*161', './output/small.jpg');
JPEG('./output/medium.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./output/medium.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./output/medium.jpg', null, '75*75', './output/square.jpg');

Bu neredeyse 4 kat daha hızlı, (benim bilgisayar ATM :P gerçekten yavaş) "sadece" 16 saniye sürer.


Durumda Here is the JPEG() fonksiyonu kendi kriterleri yapmak istiyorum:

function JPEG($source, $crop = null, $scale = null, $destination = null)
{
    $source = ImageCreateFromJPEG($source);

    if (is_resource($source) === true)
    {
        $size = array(ImageSX($source), ImageSY($source));

        if (isset($crop) === true)
        {
            $crop = array_filter(explode('/', $crop), 'is_numeric');

            if (count($crop) == 2)
            {
                $crop = array($size[0] / $size[1], $crop[0] / $crop[1]);

                if ($crop[0] > $crop[1])
                {
                    $size[0] = $size[1] * $crop[1];
                }

                else if ($crop[0] < $crop[1])
                {
                    $size[1] = $size[0] / $crop[1];
                }

                $crop = array(ImageSX($source) - $size[0], ImageSY($source) - $size[1]);
            }

            else
            {
                $crop = array(0, 0);
            }
        }

        else
        {
            $crop = array(0, 0);
        }

        if (isset($scale) === true)
        {
            $scale = array_filter(explode('*', $scale), 'is_numeric');

            if (count($scale) >= 1)
            {
                if (empty($scale[0]) === true)
                {
                    $scale[0] = $scale[1] * $size[0] / $size[1];
                }

                else if (empty($scale[1]) === true)
                {
                    $scale[1] = $scale[0] * $size[1] / $size[0];
                }
            }

            else
            {
                $scale = array($size[0], $size[1]);
            }
        }

        else
        {
            $scale = array($size[0], $size[1]);
        }

        $result = ImageCreateTrueColor($scale[0], $scale[1]);

        if (is_resource($result) === true)
        {
            if (ImageCopyResampled($result, $source, 0, 0, $crop[0] / 2, $crop[1] / 2, $scale[0], $scale[1], $size[0], $size[1]) === true)
            {
                return ImageJPEG($result, $destination, 90);
            }
        }
    }

    return false;
}