/ Ürün / yastığı sabit bir boyutu resmi yeniden boyutlandırma

11 Cevap php

Ben sabit bir boyutu bir resmi yeniden boyutlandırmak gerekir. Ama genişlik ve yüksekliği arasındaki faktörler tutmak zorundadır.

I 210 / 150 için 238 (w) X 182 (h) bir resmi yeniden boyutlandırmak istiyorsanız söyleyin

Ben şimdi ne olduğunu:

Original width / target width = 1.333333
Original Height / target Height = 1.213333

Şimdi küçük faktörü alır.

Now I always have the right width since 238 / 1.333333 = 210. But the height is still 160.

Nasıl yüksekliği pic bozmadan 160 aşağı alabilirim?

Ben kırpmak gerekiyor mu? Öyleyse nasıl olur?

11 Cevap

Bu çözümü temelde Can Berk Güder adlı aynıdır, ancak bazı zaman yazma ve yorumlama geçirdikten sonra, ben gönderme gibi hissettim.

This function creates a thumbnail that is exactly as big as the size you give it. The image is resized to best fit the size of the thumbnail. If it does not fit exactly in both directions, it's centered in the thumnail. Extensive comments explain the goings-on.

function thumbnail_box($img, $box_w, $box_h) {
    //create the image, of the required size
    $new = imagecreatetruecolor($box_w, $box_h);
    if($new === false) {
        //creation failed -- probably not enough memory
        return null;
    }


    //Fill the image with a light grey color
    //(this will be visible in the padding around the image,
    //if the aspect ratios of the image and the thumbnail do not match)
    //Replace this with any color you want, or comment it out for black.
    //I used grey for testing =)
    $fill = imagecolorallocate($new, 200, 200, 205);
    imagefill($new, 0, 0, $fill);

    //compute resize ratio
    $hratio = $box_h / imagesy($img);
    $wratio = $box_w / imagesx($img);
    $ratio = min($hratio, $wratio);

    //if the source is smaller than the thumbnail size, 
    //don't resize -- add a margin instead
    //(that is, dont magnify images)
    if($ratio > 1.0)
        $ratio = 1.0;

    //compute sizes
    $sy = floor(imagesy($img) * $ratio);
    $sx = floor(imagesx($img) * $ratio);

    //compute margins
    //Using these margins centers the image in the thumbnail.
    //If you always want the image to the top left, 
    //set both of these to 0
    $m_y = floor(($box_h - $sy) / 2);
    $m_x = floor(($box_w - $sx) / 2);

    //Copy the image data, and resample
    //
    //If you want a fast and ugly thumbnail,
    //replace imagecopyresampled with imagecopyresized
    if(!imagecopyresampled($new, $img,
        $m_x, $m_y, //dest x, y (margins)
        0, 0, //src x, y (0,0 means top left)
        $sx, $sy,//dest w, h (resample to this size (computed above)
        imagesx($img), imagesy($img)) //src w, h (the full size of the original)
    ) {
        //copy failed
        imagedestroy($new);
        return null;
    }
    //copy successful
    return $new;
}

Örnek kullanım:

$i = imagecreatefromjpeg("img.jpg");
$thumb = thumbnail_box($i, 210, 150);
imagedestroy($i);

if(is_null($thumb)) {
    /* image creation or copying failed */
    header('HTTP/1.1 500 Internal Server Error');
    exit();
}
header('Content-Type: image/jpeg');
imagejpeg($thumb);

Minik oluştururken bu ben (kırpma daha) iyi bir yaklaşım olduğunu düşünüyorum, resmi kırpmak, ancak gerekirse yeni bir imaj etrafında boşluk bırakır.

$w = 210;
$h = 150;

$orig_w = imagesx($original);
$orig_h = imagesy($original);

$w_ratio = $orig_w / $w;
$h_ratio = $orig_h / $h;

$ratio = $w_ratio > $h_ratio ? $w_ratio : $h_ratio;

$dst_w = $orig_w / $ratio;
$dst_h = $orig_h / $ratio;
$dst_x = ($w - $dst_w) / 2;
$dst_y = ($h - $dst_h) / 2;

$thumbnail = imagecreatetruecolor($w, $h);

imagecopyresampled($thumbnail, $original, $dst_x, $dst_y,
                   0, 0, $dst_w, $dst_h, $orig_w, $orig_h);

Belki (bu GD ve Imagemagick ile çalışır) PHPThumb bakmak almak

Sadece bir büyük görüntüler yüksek kalitede hızlı küçük nesil için ipucu: (from the php.net site)

: Eğer two aşamada üzerlerine nesil yaparsanız

  1. Hızlı boyutlandırma kullanarak iki kat nihai boyutları ile bir ara görüntü, özgün itibaren
  2. Ara görüntüden yüksek kaliteli bir yeniden örnekleme kullanılarak nihai küçük resminin

o zaman bu çok daha hızlı olabilir; 1. adımda yeniden boyutlandırma boyutu nispeten kalitesiz olduğunu ancak 2. adımda kalitesi iyi olduğunu yeterince ekstra çözünürlüğe sahip ve ara görüntü yeterince küçük olduğundan (2:1 boyutlandırmayla üzerinde güzel çalışıyor) yüksek-kaliteli resample çok hızlı ilerler.

Ben daha ziyade resim sınırı içinde bulunan ve böylece yeniden boyutlandırmak ve daha sonra boş kısımlarını doldurun ediyorum. Yani yukarıdaki örnekte size yüksekliği Tamam, böylece yeniden boyutlandırmak istiyorsunuz, sonra sola (her uçta 7 piksel sanırım) doldurmak ve doğru bir arka plan rengiyle.

PHP-kaynaklı web sayfası içinde yeniden boyutlandırma sorunlu olabilir. (Diskte 2 + MB yaklaşan) Büyük görüntüler onlar sürecine bellek 32MB daha fazla ihtiyaç o kadar büyük olabilir.

Bu nedenle, ben buna kullanılabilir bellek kadar-128MB ya da ihtiyacı kadar kullandığı standart bir komut satırı ile, bir CLI tabanlı bir script bunu yapmak ya eğilimindedir.

# where to put the original file/image. It gets resized back 
# it was originally found (current directory)
SAFE=/home/website/PHOTOS/originals
# no more than 640x640 when finished, and always proportional
MAXSIZE=640
# the larger image is in /home/website/PHOTOS/, moved to .../originals
# and the resized image back to the parent dir.
cd $SAFE/.. && mv "$1" "$SAFE/$1" && \
   convert "$SAFE/$1" -resize $MAXSIZE\x$MAXSIZE\> "$1"

'Dönüştürmek' ImageMagick komut satırı araçlarının bir parçasıdır.

Bu minik nelerdir? eğer onlar, kırpma çok büyük bir sorun değildir. biz bunu her zaman yapmak. i bile utangaç uzakta sadece iyi görünüyor eğer, sakat kuadratik küçük rasgele oranları kırpma tamamen (evet, ben that hardcore) görüntüyü karıştırmasını yapmak. Bu teknik bir soruya cevap tasarımcıları, ama yine de. kırpma korkma!

I think there is a little confusion.. If you only want to resize it, keeping the original ratio, the right operation is:

$ratio = $originalWidth / $originalHeight;
if(//you start from the width, and want to find the height){
 $newWidth = $x;
 $newHeight = $x / $ratio;
}else if(//you start from the height, and want to find the width){
 $newHeight = $x;
 $newWidth = $x * $ratio;
}

Öneki newWidth ve newHeight değişmiş olamaz, ve başparmak oranı orijinal oranından farklı ise Else, tek yol başparmak sınırları kırpmak ya da eklemektir.

Your'e üzerinde kesme yol almak için, bu fonksiyon i 5 dakika içinde yıllar önce yazdı (size yardımcı olabilir, belki bazı iyileştirme gerekiyor .. o ;) örneğin, sadece jpg ile çalışır:

    function thumb_cut($nomeimage, $source_path, $destination_path, $new_width, $new_height){
      list($width, $height, $type, $attr) = getimagesize($source_path.$nomeimage);
      if($type == 2){
        if($width > $new_width){
          $new_width = $width;
          $new_height = $height;
        }
        $compression = 100;
        $destimg = imagecreatetruecolor($new_width,$new_height) or die("Problems creating the image");
        $srcimg = ImageCreateFromJPEG($source_path.$nomeimage) or die("problem opening the image");
        $w = ImageSX($srcimg);
        $h = ImageSY($srcimg);
        $ro = $new_width/$new_height;
        $ri = $w/$h;
        if($ro<$ri){
          $par = "h";
        }else{
          $par = "w";
        }
        if($par == "h"){
          $ih = $h;
          $conv = $new_width/$new_height;
          $iw = $conv*$ih;
          $cw = ($w/2)-($iw/2);
          $ch = ($h/2)-($ih/2);
        }else if($par == "w"){
          $iw = $w;
          $conv = $new_height/$new_width;
          $ih = $conv*$iw;
          $cw = ($w/2)-($iw/2);
          $ch = ($h/2)-($ih/2);
        }
        ImageCopyResampled($destimg,$srcimg,0,0,$cw,$ch,$new_width,$new_height,$iw,$ih) or die("problems with resize");
        ImageJPEG($destimg,$destination_path.$nomeimage,$compression) or die("problems with storing new image");
      }
    }

Bu link yardımcı olur olmadığına bakın: Crop-To-Fit an Image Using ASP/PHP

: Tekniği için

  1. diğer istenen boyutları aşıyor ise bir boyut eşleşecek şekilde görüntüyü yeniden boyutlandırmak
  2. boyutlandırılan görüntünün merkezinden istenilen boy resmi çıkar.

Yeniden boyutlandırmak-to-sığdırmak için verilen boyutlar içinde bir resim gerekiyorsa, this makale bakabilirsiniz.

Eğer boyutlandırma matematik yapmak nasıl şaşkın eğer Son olarak, kaynak ve hedef görüntüleri oranları aynı ise, bu ilişki tutar unutmayın:

SourceWidth / SourceHeight = DestinationWidth / DestinationHeight

Eğer üç parametre biliyorsanız, kolayca dördüncü birini hesaplayabilirsiniz.

Ancak bu resmi berbat olabilir, hedef büyüklüğü almak için alt ve üst kapalı 5 px kırpmak gerekecek.

Gerçekten, bir hedef genişlik veya yüksekliğe sahip olmalıdır sonra aynı oranda diğer boyutu ayarlayabilirsiniz.