1

我正在尝试重新设计我的网站,以便我原来的方形、基于平铺的图像渲染可以更像是图像的剪切......以摆脱那种网格图案。

这是它最初的样子......

在此处输入图像描述

这是我要做什么的粗略模型:

在此处输入图像描述

所以我重新保存了一个透明背景的图像缩略图......我只想让狗显示,而正方形是透明的,它将在下面显示网站的背景。

在此处输入图像描述

然而,当我在页面上渲染它时,它的背景是黑色的。

在此处输入图像描述

我检查了我的 CSS 以查看是否有某种 img 类或渲染漫画的类......甚至引导程序查看可能将背景颜色分配给黑色的位置(并且还搜索了十六进制代码000000),但没有找到...

然后我发现它与我的缩略图脚本重新采样 png 的方式有关......因为我得到了所谓透明图像的黑色背景,我责怪imagecreatetruecolor()哪个returns an image identifier representing a black image of the specified size..

我尝试在这里关注Cheekysoft关于在重新采样后保持透明度的问题......但它没有用......他的两个要点是:

imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

我发现如果我$img = imagecreatefrompng($image_file);在调整大小/重新采样之前放置它,它会透明地显示......这就是我想要的......但不是在我重新采样之后。

Thumbnailer.php 代码:

    <?php
#Appreciation goes to digifuzz (http://www.digifuzz.net) for help on this

$image_file = $_GET['img']; //takes in full path of image
$MAX_WIDTH = $_GET['mw'];
$MAX_HEIGHT = $_GET['mh'];
global $img;

//Check for image
if(!$image_file || $image_file == "") { 
    die("NO FILE."); 
}

//If no max width, set one
if(!$MAX_WIDTH || $MAX_WIDTH == "") { 
    $MAX_WIDTH="100"; 
}

//if no max height, set one
if(!$MAX_HEIGHT || $MAX_HEIGHT == "") { 
    $MAX_HEIGHT = "100"; 
}

$img = null;
//create image file from 'img' parameter string
if( preg_match('/\.jpg$/',$image_file) || preg_match('/\.jpeg$/',$image_file) ){ 
    $img = imagecreatefromjpeg($image_file); 
} else { 
    $img = imagecreatefrompng($image_file); 
} 

//if image successfully loaded...
if($img) {
    //get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);

    //takes min value of these two
    $scale = min($MAX_WIDTH/$width, $MAX_HEIGHT/$height);

    //if desired new image size is less than original, output new image
    if($scale < 1) {
        $new_width = floor($scale * $width);

        $new_height = floor($scale * $height);


        $tmp_img = imagecreatetruecolor($new_width, $new_height);

        //copy and resize old image to new image
        imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

        //replace actual image with new image
        $img = $tmp_img;
    }
}
//set the content type header
header('Content-Type: image/png', true); 

imagealphablending( $img, false );
imagesavealpha( $img, true );
imagepng($img); 


imagedestroy($img);

?>

任何人都可以帮忙吗?

谢谢!

4

2 回答 2

1

在重新采样/调整图像大小之前,您需要在目标图像上调用 imagealphablending():

//copy and resize old image to new image
imagealphablending($tmp_img, false);
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
// ...
于 2013-04-18T05:25:24.227 回答
1

创建图像后,您将 alphablending 和 traparent 代码放置在下面。只需将它们放在您的 createresample 行和带有 imagecreatefrompng 创建的图像的透明图像之前。

imagealphablending( $tmp_img, false );
imagesavealpha( $tmp_img, true );
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

或者您可以尝试以下

$img = ImageCreateFromPNG($image_file);
$tmp_img = imagecreatetruecolor($new_width,$new_height);
imagecolortransparent($tmp_img, imagecolorallocate($tmp_img, 0, 0, 0));
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
于 2013-04-18T05:25:29.317 回答