Resim galerisi oluşturma

7 Cevap php

Benim web sitesi için resim galerisi oluşturmak ve web sitesinin yönetim panelinden o resimleri yüklemek istiyorum. Ben çok küçük bir boyutu olan bir sayfadaki tüm resimleri göstermek için gidiyorum, ve bir yerde ben büyük boy (küçük olanlardan) seçilen resim göstermek için her resim için ayrı olacaktır.

Bunu yapmanın iki yolu biliyoruz:

  1. Ben yönetim paneli, bir büyük ve sabit bir boyutu ile küçük birinden yüklemek için 2 resim oluşturun. Yani büyük bir ben ayrı büyük boşluk yüklenecektir. Ve küçük küçük yerlerde gösterilir. Yani sitenin yöneticisi 2 resimler oluşturmanız gerekir.

  2. Biliyorum ikinci yolu sadece büyük resmi yüklemek için, ve her yerde bir PHP işlevi büyük resmi yeniden boyutlandırmak ve ben galeri için gereken 2 boyutlarını alacak edebilmek için PHP GD kütüphanesi kullanmaktır.

İlk yöntemin dezavantajı sitenin kullanıcı Photoshop veya yüklemeden önce bazı başka bir araç kullanması gerektiğini, olduğunu. Kullanıcının bu site kullanıcı için hoş bir şey olmadığını kabul edelim.

GD kalitesini düşürerek resmi boyutlandırır olarak ikinci yaklaşım, ya da iyi değil. Çok fazla olduğu için bu kaybı kabul edilemez.

Orijinal resim kalitesine yakın korurken bu boyutlandırma işlemi yapan bir yolu nedir?

Yoksa bu iki daha iyidir başka yaklaşım nedir?

7 Cevap

Bu gibi aşağıdaki işlevini kullanın:

Image('/path/to/original.image', '1/1', '150*', './thumb.jpg'); // thumb, width = 150 px
Image('/path/to/original.image', null, '600*', './full.jpg'); // full, width = 600 px

Eğer isterseniz, aynı zamanda (* h w) üçüncü arguman resized resmin genişlik ve / veya yükseklik belirtebilirsiniz ikinci argüman (w / h) üzerinden ürün oranını belirtebilirsiniz.

function Image($source, $crop = null, $scale = null, $destination = null)
{
    $source = @ImageCreateFromString(@file_get_contents($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)
    	{
    		ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
    		ImageSaveAlpha($result, true);
    		ImageAlphaBlending($result, true);

    		if (ImageCopyResampled($result, $source, 0, 0, $crop[0] / 2, $crop[1] / 2, $scale[0], $scale[1], $size[0], $size[1]) === true)
    		{
    			ImageConvolution($result, array(array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1)), 8, 0);
    			ImageJPEG($result, $destination, 90);
    		}
    	}
    }

    return false;
}

The image is automatically enhanced (sharpened) and saved as a JPEG with high quality.

Tadını çıkarın!

GD artık Photoshop daha kaliteli kaybetmez. Sadece o Resampling her türlü yapmaz gibi kullanan imagecopyresampled() ve DEĞİL imagecopyresized() emin olun. Sonra yeterince yüksek kalitede çıkan görüntü kaydetmek; JPEG en için, bu 80 civarı.

Sonra, Photoshop benzeri bir boyutlandırma yapmak ve size çok fark yok görürsünüz. Ayrıca minik keskinleştirmek için GD kullanabilirsiniz, bu onları biraz ekstra canlılık vereceğiz.

EDIT

Ben, farklı boyutlandırma yöntemleri karşılaştırmak denemek ve kendiniz için görmek için bir araç yaptıklarımızı iyi yöntemdir: http://www.ulmanen.fi/stuff/downsample/

Neden kullanmayın phpThumb()?

  • Yalnızca görüntü etiketleri için src bağlantıları oluşturmak gerekir.
  • Otomatik cache.
  • Görüntüleri işlemek için bir çok seçenek sunuyor. demo sayfasına bakınız.
  • Kullanımları ImageMagick ve son çare olarak GD, sen umurumda gerekmez (ama olabilir) olduğunu.
  • Neredeyse her şey yapılandırılabilir. Bkz: phpThumb.config.php.

Muhtemelen daha iyi sonuçlar elde etmek için ImageMagick yerine GD içinde kullanabilirsiniz. Ben size ihtiyacınız web sitesi ile bütünleşme seviyesi ne emin değilim ama kodlama başlamadan önce ben açık kaynak Gallery proje atmanızı öneririm.

Nasıl kalite argümanını kullanarak yaklaşık imagejpeg görüntü çıktısı alıyorsunuz?

I convert ImageMagick'in gereken bu basit bir kabuk komut kullanın:

#!/bin/sh

W=256
T="Some recent photos"

cat <<EOF
<HTML>
<HEAD>
<TITLE>$T</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">
</HEAD>
<BODY STYLE="font-family: sans-serif">
<H1>$T</H1>
Click on the photos to enlarge<P>
EOF

for i
do
convert -resize $W "$i" "T$i"
cat <<EOF
<A HREF="$i"><IMG SRC="T$i" WIDTH=$W></A>
EOF
done

cat <<EOF
</BODY></HTML>
EOF

Eğer görüntülerin depolandığı hakkında seçici değilseniz, size Flickr PHP API'sini kullanabilirsiniz. Flickr boyutlarda çeşitli görüntüleri sağladığından, galeri için düzen verme ile size bırakır.

Çıkış http://phpflickr.com/

Ben bir proje için bu kullanılan ettik ve ne kadar kolay şaşırdı. Temelde bu API sayesinde her işlemi yapabilir ve siz de birkaç kullanıcılar için bunu yapabilirsiniz, böylece kendinizi ve başkalarını zaman çok kaydetmek için gidiyoruz. Ve boşluk söz değil -!)