我正在尝试在PHP中调整透明背景的png,我在网上找到的代码示例对我不起作用。这是我正在使用的代码,建议将不胜感激!

$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);

,点击 的更新 通过'不工作'我的意思是当我调整pngs时,背景颜色变为黑色。

有帮助吗?

解决方案

据我所知,您需要将混合模式设置为 false ,然后将通道标志设置为 true 之前做imagecolorallocatealpha()

<?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]);
?>

更新:此代码仅适用于透明度不透明度= 0的背景。如果您的图片有0&lt;不透明度&lt; 100它将是黑色背景。

其他提示

这是一个适合我的最终解决方案。

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;
}

还需要用透明色填充新图像(正如Dycey编码但我猜想忘了提及:)),而不仅仅是“战略性”保存本身。

IIRC,你还需要确保PNG是24位,即真彩色,而不是8位,以避免错误的行为。

旧线程,但为了以防万一 - 如果你正确地命名,Dycey的例子应该可行。这是我的图像大小调整类中使用的修改版本。请注意检查以确保imagecolorallocatealpha()已定义,如果您使用的是GD&lt; 2.0.8

则不会
  /**
     * 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);
            }
        }
    }

它可能与较新版本的PHP(我使用PHP 5.6测试过)有关,但现在无需用透明背景填充图像即可使用:

$image_p = imagecreatetruecolor(480, 270);
imageAlphaBlending($image_p, false);
imageSaveAlpha($image_p, true);
$image = imagecreatefrompng('image_with_some_transaprency.png');
imagecopyresampled($image_p, $image, 0, 0, 0, 0, 480, 270, 1920, 1080);
imagepng($image_p, 'resized.png', 0);

这也不适合我:( 这是我的解决方案..但我也得到黑色背景,图像不透明

    <?php
$img_id = 153;

$source = "images/".$img_id.".png";
$source = imagecreatefrompng($source);
$o_w = imagesx($source);
$o_h = imagesy($source);

$w = 200;
$h = 200;

$newImg = imagecreatetruecolor($w, $h);
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $w, $h, $transparent);
imagecopyresampled($newImg, $source, 0, 0, 0, 0, $w, $h, $o_w, $o_h);

imagepng($newImg, $img_id.".png");

?>
<img src="<?php echo $img_id.".png" ?>" />

完整的例子。请注意,对于在互联网上找到的某些png图像,它的工作方式不正确,但对于我自己创建的photoshop,它可以正常工作。

    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

以下是png文件的完整代码,保留了图像的透明度。

list($width, $height) = getimagesize($filepath);
$new_width = "300";
$new_height = "100";

if($width>$new_width && $height>$new_height)
{
    $image_p = imagecreatetruecolor($new_width, $new_height);
    imagealphablending($image_p, false);
    imagesavealpha($image_p, true);
    $image = imagecreatefrompng($filepath);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagepng($image_p,$filepath,5);
}

上述解决方案也不适合我。这就是我发现解决问题的方式。

// upload directory
$upload_dir = "../uploads/";
// valid image formats
$valid_formats = array("jpg", "jpeg", "png");
// maximum image size 1 mb
$max_size = 1048576;
// crop image width, height
$nw = $nh = 800;
$nw1 = $nh1 = 400;
$nw3 = $nh3 = 200;
$nw2 = $nh2 = 100;
// checks that if upload_dir a directory/not
if (is_dir($upload_dir) && is_writeable($upload_dir)) {
    // not empty file
    if (!empty(

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image'])) { // assign file name $name =

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image']['name']; //

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES to execute all files within a loop if (

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image']['error'] == 4) { $message = "Empty FIle"; } if (

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image']['error'] == 0) { if (

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image']['size'] > $max_size) { echo "E-Image is too large!<br>";

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['alert'] = "Image is too large!!"; } else if (!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats)) {

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['alert'] = "This image is not a valid image format!!"; echo "E-This image is not a valid image format<br>"; } else if (file_exists($upload_dir . $name)) {

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['alert'] = "Image already exists!!"; echo "E-Image already exists<br>"; } else { // No error found! Move uploaded files $size = getimagesize(

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES['image']['tmp_name']); $x = (int)

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['x']; $y = (int)

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['y']; $w = (int)

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['w'] ?

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['w'] : $size[0]; $h = (int)

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['h'] ?

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>POST['h'] : $size[1]; // path for big image $big_image_path = $upload_dir . "big/" . $name; // medium image path $medium_image_path = $upload_dir . "medium/" . $name; // small image path $small_image_path = $upload_dir . "small/" . $name; // check permission if (!is_dir($upload_dir . "big/") && !is_writeable($upload_dir . "big/")) { mkdir($upload_dir . "big/", 0777, false); } if (!is_dir($upload_dir . "medium/") && !is_writeable($upload_dir . "medium/")) { mkdir($upload_dir . "medium/", 0777, false); } if (!is_dir($upload_dir . "small/") && !is_writeable($upload_dir . "small/")) { mkdir($upload_dir . "small/", 0777, false); } // image raw data from form $data = file_get_contents(

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>FILES["image"]["tmp_name"]); // create image $vImg = imagecreatefromstring($data); //create big image $dstImg = imagecreatetruecolor($nw, $nh); imagealphablending($dstImg, false); $trans_colour = imagecolorallocatealpha($dstImg, 0, 0, 0, 127); imagefilledrectangle($dstImg, 0, 0, $w, $h, $trans_colour); imagesavealpha($dstImg, true); imagecopyresampled($dstImg, $vImg, 0, 0, $x, $y, $nw, $nh, $w, $h); imagepng($dstImg, $big_image_path); //create medium thumb $dstImg1 = imagecreatetruecolor($nw1, $nh1); imagealphablending($dstImg1, false); $trans_colour1 = imagecolorallocatealpha($dstImg1, 0, 0, 0, 127); imagefilledrectangle($dstImg1, 0, 0, $w, $h, $trans_colour1); imagesavealpha($dstImg1, true); imagecopyresampled($dstImg1, $vImg, 0, 0, $x, $y, $nw1, $nh1, $w, $h); imagepng($dstImg1, $medium_image_path); // create smallest thumb $dstImg2 = imagecreatetruecolor($nw2, $nh2); imagealphablending($dstImg2, false); $trans_colour2 = imagecolorallocatealpha($dstImg2, 0, 0, 0, 127); imagefilledrectangle($dstImg2, 0, 0, $w, $h, $trans_colour2); imagesavealpha($dstImg2, true); imagecopyresampled($dstImg2, $vImg, 0, 0, $x, $y, $nw2, $nh2, $w, $h); imagepng($dstImg2, $small_image_path); /* * Database insertion */ $sql = "INSERT INTO tbl_inksand_product_gallery (" . "Product_Id,Gallery_Image_Big,Gallery_Image_Medium,Gallery_Image_Thumb," . "Gallery_Status,Created_By,Created_Datetime" . ") VALUES (" . "'{$Product_Id}','{$big_image_path}','{$medium_image_path}','{$small_image_path}'," . "'A','$Created_By','{$time}'" . ")"; db_query($sql); if (db_affected_rows() == 1) { if (imagedestroy($dstImg)) {

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['success'] = "Image uploaded successfully."; echo "S-Image uploaded successfully<br>"; } else {

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['alert'] = "Image not uploaded!!"; echo "S-Image not uploaded"; } } else {

上述解决方案也不适合我。这就是我发现解决问题的方式。

<*>SESSION['alert'] = "Error in uploading image!!"; echo "E-Error in uploading image!!"; } } } } } else { mkdir($upload_dir, 0777); }
与imagecopyresampled相比,使用imagescale更好。调整大小的图像不需要空图像资源,与imagecopyresampled所需的10个参数相比,只需要两个参数。更小的尺寸也可以产生更好的质量。如果使用PHP 5.5.18或更早版本,或PHP 5.6.2或更早版本,则应提供高度,即第3个参数,因为宽高比计算不正确。

$this->image =   imagecreatefrompng($filename);
$scaled = imagescale($this->image, $width);
imagealphablending($scaled, false);
imagesavealpha($scaled, true);
imagepng($scaled, $filename);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top