PHP nasıl şeffaflık ile pngs boyutlandırmak mi?

5 Cevap php

Ben benim için çalışmak yok çevrimiçi buldum şeffaf PHP geçmişleri ve kod örnekleri ile pngs yeniden boyutlandırmak için çalışılıyor. İşte kullanıyorum kod, tavsiye çok takdir edilecektir oluyor!

$this->image = imagecreatefrompng($filename);

imagesavealpha($this->image, true);
$newImage = imagecreatetruecolor($width, $height);

// Make a new transparent image and turn off alpha blending to keep the alpha channel
$background = imagecolorallocatealpha($newImage, 255, 255, 255, 127);
imagecolortransparent($newImage, $background);
imagealphablending($newImage, false);
imagesavealpha($newImage, true);

imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height,  $this->getWidth(), $this->getHeight());
$this->image = $newImage;  
imagepng($this->image,$filename);


Update By 'not working' I meant to say the background color changes to black when I resize pngs.

5 Cevap

Ne söyleyebilirim itibaren, false harmanlama modunu ayarlamak gerekir, ve gerçek before Eğer imagecolorallocatealpha için alfa kanalı bayrağı save ()

<?php
 $newImg = imagecreatetruecolor($nWidth, $nHeight);
 imagealphablending($newImg, false);
 imagesavealpha($newImg,true);
 $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
 imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
 imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight,
                      $imgInfo[0], $imgInfo[1]);
?>

UPDATE: Bu kod sadece arka plan üzerinde çalışıyor şeffaf ölçebilmelidirler = 0 resim 0 varsa <. donukluk < 100 siyah arka plan olacak.

Şeffaf bir renk ile yeni imaj dolgu de gereklidir (Dycey kodlu olarak ama :) söylemeyi unuttum tahmin ediyorum), sadece 'stratejik' kendisi tarafından tasarruf edilmektedir.

IIRC, ayrıca PNG 24bit, yani truecolor ve hatalı bir davranış önlemek için 8bit olmadığından emin olmak gerekir.

eski iplik, ama sadece durumda - doğru şeyler isim ise Dycey örneğinin, çalışması gerekir. İşte benim resim boyutlandırma sınıfında kullanılan değiştirilmiş bir versiyonu. Eğer GD <2.0.8 kullanıyorsanız olmayacak emin imagecolorallocatealpha () tanımlanır yapmak için onay edin

  /**
     * usually when people use PNGs, it's because they need alpha channel 
     * support (that means transparency kids). So here we jump through some 
     * hoops to create a big transparent rectangle which the resampled image 
     * will be copied on top of. This will prevent GD from using its default 
     * background, which is black, and almost never correct. Why GD doesn't do 
     * this automatically, is a good question.
     *
     * @param $w int width of target image
     * @param $h int height of target image
     * @return void
     * @private
     */
    function _preallocate_transparency($w, $h) {
        if (!empty($this->filetype) && !empty($this->new_img) && $this->filetype == 'image/png')) {
            if (function_exists('imagecolorallocatealpha')) {
                imagealphablending($this->new_img, false);
                imagesavealpha($this->new_img, true);
                $transparent = imagecolorallocatealpha($this->new_img, 255, 255, 255, 127);
                imagefilledrectangle($this->new_img, 0, 0, $tw, $th, $transparent);
            }
        }
    }

İşte benim için iyi çalışıyor nihai çözümdür.

function resizePng($im, $dst_width, $dst_height) {
    $width = imagesx($im);
    $height = imagesy($im);

    $newImg = imagecreatetruecolor($dst_width, $dst_height);

    imagealphablending($newImg, false);
    imagesavealpha($newImg, true);
    $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
    imagefilledrectangle($newImg, 0, 0, $width, $height, $transparent);
    imagecopyresampled($newImg, $im, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);

    return $newImg;
}

Tam örnek. Bu yanlış işleri internet üzerinde bulunan bazı png görüntüleri için dikkat edin, ama photoshop ile oluşturulan kendi için çalışıyor.

    header('Content-Type: image/png');

$filename = "url to some image";

$newWidth = 300;
$newHeight = 300;

$imageInfo = getimagesize($filename);

$image = imagecreatefrompng($filename); //create source image resource
imagesavealpha($image, true); //saving transparency

$newImg = imagecreatetruecolor($newWidth, $newHeight); //creating conteiner for new image
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); //seting transparent background
imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent);
imagecopyresampled($newImg, $image, 0, 0, 0, 0, $newWidth, $newHeight,  $imageInfo[0], $imageInfo[1]);

imagepng($newImg); //printout image string