Oluşturmak için çalışılıyor orantılı PHP GD ile sabit bir genişlik / yükseklik minik kırpılmış

4 Cevap php

Ben bir görüntü almak ve sabit genişlik / yükseklik onu azaltacak GD PHP ile bir hali Jeneratör oluşturmak çalışıyorum. O (benim sabit genişlik / yükseklik göre) orijinal görüntü aldığı kare orantılı doğru küçük vermek için görüntünün merkezine gelecek.

Ben bazı güzel ASCII ile bu kafa karıştırıcı cümle göstermeye çalışacağım:}

LANDSCAPE EXAMPLE:

XXXXXXXXXXXXXXXX
XXXXOOOOOOOOXXXX
XXXXOOOOOOOOXXXX
XXXXOOOOOOOOXXXX
XXXXOOOOOOOOXXXX
XXXXXXXXXXXXXXXX

    XXXXXXXX    
    XXXXXXXX    
    XXXXXXXX    
    XXXXXXXX    


PORTRAIT EXAMPLE:

    XXXXXXXX
    XXXXXXXX
    OOOOOOOO
    OOOOOOOO
    OOOOOOOO
    OOOOOOOO
    XXXXXXXX
    XXXXXXXX

    XXXXXXXX    
    XXXXXXXX    
    XXXXXXXX    
    XXXXXXXX

Gördüğünüz gibi, bir küçük resim olarak kullanmak için görüntünün merkezinden bir kare çeker. Bu görüntünün yükseklik / genişlik almak ve sonra hesaplamak için, teoride basit görünüyor küçük olsun benim sabit genişlik / yükseklik dayalı ofset. Ama bunu kod bir şekilde düşünmek için görünmüyor olabilir :/

Ayrıca, nasıl merkez kareyi çekmeden önce görüntüyü yeniden boyutlandırma hakkında gitmek istiyorsunuz? Yani resim oldukça grafik yakınlaştırılmış bazıları daha orijinal bir ayrıntılı görüntü içeriyor?

4 Cevap

Ben dolaylı bir cevap veriyorum özür dilerim. Ama bu kütüphaneyi kullanarak deneyebilirsiniz: PHPThumb. Kullanımı çok kolay. Bu GD destekler ve merkezi görüntüyü yeniden boyutlandırılır adaptive resizing adlandırılan bu işlevi vardır.

İşte adaptif yeniden boyutlandırma için dokümanlar bir örnek kod:

<?php

require_once 'path/to/ThumbLib.inc.php';

try
{
     $thumb = PhpThumbFactory::create('/path/to/image.jpg');
}
catch (Exception $e)
{
     // handle error here however you'd like
}

$thumb->adaptiveResize(175, 175);
$thumb->show();

?>

Bu sizin için ne arıyorsanız:

Crop-To-Fit an Image Using ASP/PHP

Komut portre / manzara görüntüleri üzerinden kare küçük oluşturmak için kullanılabilir. Çözelti iki adımları gerektirir:

Diğer eşit veya daha büyük ise boyutun biri istenilen ölçüye uyan, böylece 1: orantılı görüntüyü yeniden boyutlandırmak.

  • Örnek 1: Eğer orantılı 266x200px için (ar = 1,33) görüntüyü yeniden boyutlandırmak gerekir 200x200px bir 1024x768px görüntü (ar = 1.33) kırpmak için
  • Örnek 2: orantılı 200x300px için (ar = 0,66) görüntüyü yeniden boyutlandırmak gerekir 200x200px bir 600x900px görüntü (ar = 0.66) kırpmak için

2: görüntünün ortasından ürün; matematik basittir.

  • Örnek 1: 33,0 bir 266x200px görüntü, mahsulden 200x200px kısmını ayıklamak için
  • Örnek 2: 0,50 bir 200x300px görüntü, mahsulden 200x200px kısmını ayıklamak için

Landscape cropping

Portrait cropping

How about this: It's take an image of any size and proportionately resize it down (or up) to fill a canvas of any dimensions.

E.g. Source image is: 400w x 600h and thumbnail size needs to be 100w x 225h - the output image will be 100w x 225h and the images will be vertically centered with a width of 100 (the maximum) and height 150 (with a top and bottom border of 37.5 pixels)

İşte fonksiyonu bulunuyor

function resize_to_canvas($filename,$canvas_w=100,$canvas_h=225){
list($width, $height, $type) = getimagesize($filename);

$original_overcanvas_w = $width/$canvas_w;
$original_overcanvas_h = $height/$canvas_h;

$dst_w = round($width/max($original_overcanvas_w,$original_overcanvas_h),0);
$dst_h = round($height/max($original_overcanvas_w,$original_overcanvas_h),0);

$dst_image = imagecreatetruecolor($canvas_w, $canvas_h);
$background = imagecolorallocate($dst_image, 255, 255, 255);
imagefill($dst_image, 0, 0, $background);

$src_image = imagecreatefromjpeg($filename);
imagecopyresampled($dst_image, $src_image, ($canvas_w-$dst_w)/2, ($canvas_h-$dst_h)/2, 0, 0, $dst_w, $dst_h, $width, $height);
imagegif($dst_image, $filename);
imagedestroy($dst_image);}

Bu işlev, orijinal dosya yerini alacak, ancak kolayca yeni bir resim oluşturmak için modifiye edilir. Sadece dosya adını hattı imagegif ($ dst_image, $ dosya) değiştirmek;

Net ve iyi tanımlanmış bir amaç olmadan, bir iyi-uygun bir çözüm denemek ve sunmak zordur. En azından masaya bir çözüm girişimini getirmek eğer Ayrıca, diğer Stackers daha yararlı bulmak eğiliminde olacaktır.

Hala sorun varsa, kod örnekleri ve ayrıntıları ile (başka sorular göndermek için çekinmeyin, bir gitmek vermek, ve - Söyleniyor, ben en azından başlamak size bir fikir verebilir çevrimiçi öğreticiler bir çift bulduk ne) kendisini davranmak değildir.