Nasıl GD kullanarak bir PNG yüklenen bir görüntüyü yeniden boyutlandırmak ve dönüştürmek mi

8 Cevap php

Kullanıcıların formatları (GIF, JPEG, PNG ve en azından) çeşitli avatar-tipi resim yüklemek için, ancak PNG veritabanı BLOB'ları olarak hepsini kaydetmek için izin istiyorum. Görüntüler boy iseniz, pixelwise, ben DB-yerleştirilmeden önce onları yeniden boyutlandırmak istiyorum.

Boyutlandırma ve PNG dönüşüm yapmak için GD kullanmak için en iyi yolu nedir?

Edit: Ne yazık ki, sadece GD ben kullanmak gerekiyor sunucusu, hiçbir ImageMagick mevcuttur.

8 Cevap

Sizin süreç adımlar bu gibi görünmelidir:

  1. Verify filetype
  2. O imagecreatefrom* kullanarak GD içine desteklenen filetype ise görüntüyü yükleyin
  3. imagecopyresize veya imagecopyresampled kullanarak yeniden boyutlandırma
  4. Kullanarak görüntüyü kurtarmak imagepng($handle, 'filename.png', $quality, $filters)

ImageMagick, daha hızlı daha iyi görüntü üretir, daha yapılandırılabilir, ve nihayet (IMO) için kod çok daha kolaydır.

@ ceejayoz Sadece yeni GD için bekleyin - bu MySQLi gibi OOP ve o aslında kötü değil :) bulunuyor

Eğer GDlib kullanmak istiyorsanız, GDlib 2 veya daha yüksek kullanın. Bu yeniden boyutlandırma sırasında piksel sokmak ve çok daha iyi görünecek imagecopyresampled adında bir function () vardır.

Ayrıca, ben her zaman veritabanında görüntüleri saklamak kötü şeklidir net etrafında kaydetti duydum:

  • Bu disk daha erişim yavaştır
  • Your server will need to run a script to get to the image instead of simply serving a file
  • Your script now is responsible for a lot of stuff the web server used to handle:
    • Uygun Content-Type başlığını ayarlama
    • Istemcilerin düzgün görüntü önbelleğe böylece, doğru önbelleğe / timeout / E-etiket başlıklarını ayarlama. Düzgün bunu yapmazsanız, görüntü veren komut dosyası bile daha sunucudaki yükü artan, her istek üzerine vurmak olacak.

Görebildiğim tek avantajı size veritabanı ve senkronize görüntü dosyaları tutmak gerek kalmamasıdır. Ama hala buna karşı öneriyoruz.

Eğer sunucu üzerinde hiçbir ImageMagick emin misiniz?

Ben konuk PHP kullanmak (soru PHP ile etiketlenmiş). Ben ImageMagick uzantısı kullanmak hosting şirketi) (phpinfo göre döndü.

Ben onlara sorulduğunda Ama onlar here is the list of ImageMagick programs available from PHP code dedi. Yani sadece - PHP hiçbir IM arayüzü var, ama ben PHP doğrudan Sohbet programları çağırabilir.

Ben aynı seçeneği var umuyoruz.

Ve ben strongly - katılıyorum veritabanında görüntüleri depolamak iyi bir fikir değildir.

Belki de böyle bir şey:


<?php
   //Input file
   $file = "myImage.png";
   $img = ImageCreateFromPNG($file);

   //Dimensions
   $width = imagesx($img);
   $height = imagesy($img);
   $max_width = 300;
   $max_height = 300;
   $percentage = 1;

   //Image scaling calculations
   if ( $width > $max_width ) { 
      $percentage = ($height / ($width / $max_width)) > $max_height ?
           $height / $max_height :
           $width / $max_width;
   }
   elseif ( $height > $max_height) {
      $percentage = ($width / ($height / $max_height)) > $max_width ? 
           $width / $max_width :
           $height / $max_height;
   }
   $new_width = $width / $percentage;
   $new_height = $height / $percentage;

   //scaled image
   $out = imagecreatetruecolor($new_width, $new_height);
   imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

   //output image
   imagepng($out);
?>

Ben kodu test değil bu yüzden bazı sözdizimi hataları olabilir, ancak size bu yapılabilir nasıl adil bir sunum vermelidir. Ayrıca, bir PNG dosyası üstlendi. Sen dosya türünü belirlemek için switch deyimi çeşit isteyebilirsiniz.

Ne istediğinizi uyabilecek gibi This article görünüyor. Sen imagepng için tasarruf imagejpeg () işlevi değiştirmeniz gerekir () ve bir dizeye dosyayı kaydetmek yerine sayfa çıktı onu var, ama bu kolay kopyası olmalıdır bunun dışında / mevcut koduna yapıştırın.

GD kesinlikle gerekli mi? ImageMagick, daha hızlı daha iyi görüntü üretir, daha yapılandırılabilir, ve nihayet için kod (IMO) çok daha kolaydır.

I this page iyi bir başlangıç ​​noktası olduğunu düşünüyorum. Bu imagecreatefrom kullanır (jpeg / gif / png) ve yeniden boyutlandırmak ve görüntü dönüştürür ve sonra tarayıcıya çıktılar. Bunun yerine kod yazımının birçok minuttes olmadan DB bir DAMLA çıktı olabilir tarayıcı çıktısı.

phpThumb bakarak değer olabilir üst düzey bir soyutlama değildir.