Alfa png ve şeffaf GIF desteklemek için benim php görüntü resizer geliştirin nasıl

2 Cevap php

Ben görüntüleri yeniden boyutlandırmak için bu işlevi kullanın ama alfa ile şeffaf bir GIF ya da PNG eğer ben ancak jpg ve png, normal için mükemmel çalışır, siyah bir arka plan ile çirkin ürpertici görüntü ile sona.

function cropImage($nw, $nh, $source, $stype, $dest) {
     $size = getimagesize($source);
     $w = $size[0];
      $h = $size[1];

      switch($stype) {
          case 'gif':
          $simg = imagecreatefromgif($source);
          break;
          case 'jpg':
          $simg = imagecreatefromjpeg($source);
          break;
          case 'png':
          $simg = imagecreatefrompng($source);
          break;
      }


     $dimg = imagecreatetruecolor($nw, $nh);

     switch ($stype)
    {
         case "png":

     imagealphablending( $dimg, false );
     imagesavealpha( $dimg, true );
     $transparent = imagecolorallocatealpha($dimg, 255, 255, 255, 127);
     imagefilledrectangle($dimg, 0,  0, $nw, $nh,  $transparent);

    break;
case "gif":
    // integer representation of the color black (rgb: 0,0,0)
    $background = imagecolorallocate($simg, 0, 0, 0);
    // removing the black from the placeholder
    imagecolortransparent($simg, $background);

    break;
     }



      $wm = $w/$nw;
      $hm = $h/$nh;
      $h_height = $nh/2;
      $w_height = $nw/2;

      if($w> $h) {
          $adjusted_width = $w / $hm;
          $half_width = $adjusted_width / 2;
          $int_width = $half_width - $w_height;
          imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
      } elseif(($w <$h) || ($w == $h)) {
          $adjusted_height = $h / $wm;
          $half_height = $adjusted_height / 2;
          $int_height = $half_height - $h_height;

     imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
      } else {
          imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
      }

      imagejpeg($dimg,$dest,100);
     }

Örnek: cropImage("300","200","original.png","png","new.png");

Ben php 5.3.2 kullanabilir ve GD kütüphanesi birlikte (2.0.34 uyumlu)

Nasıl şeffaflığı desteklemek yapmak için? I imagealphablending() ve imagesavealpha ekledim ama işe yaramadı. Ya atlast benzer herhangi bir iyi dersler var?

Teşekkürler

2 Cevap

Eğer çıktı ise çirkin siyah arka plan png görüntü kaybolur. Yani burada her ikisi de, test edilen iki alternatif çözüm vardır:

  1. Eğer png gibi üzerlerine saklayabilirsiniz, sadece bunu: değişim imagejpeg($dimg,$dest,100); için imagepng($dimg,$dest);

  2. Sırasıyla, true varsayılan değerler ve false - bu jpeg olarak depolamak için önemli ise, satırları imagealphablending( $dimg, false ); kaldırmak ve imagesavealpha( $dimg, true ); , arzu edilen bir etki sağlayacaktır. Sonuç görüntü de bir alfa kanalı varsa devre dışı bırakılması, alfa harmanlama sadece mantıklı.

Ben kendim test değil ama bu tam olarak bunu yaparken yaşadığınız bir fikir oldu benim bir proje üzerinde çalışırken.

İlk olarak, görüntüde kullanılmayan bir renk bulmak ve arka (onlar motion capture ile yapmak gibi örneğin gerçekten gösterişli yeşil) gibi bu yeni bir görüntü oluşturmak

Sonra, (bu ben resimlerin üzerine sınırları koymak için bunu yapmak için kullanılan PHP ile çalıştığını biliyorum) üzerine şeffaflık ile görüntü kopyalamak

Sonra, şeffaf olduğunu görüntüdeki renk tanımlamak ve bunu sizin gösterişli yeşil renk vermek için fonksiyon imagecolortransparent kullanın.

Ben işe yarayacağını düşünüyorum ama henüz denemedim.