带有白色背景且未集中的 PHP 缩略图

Posted

技术标签:

【中文标题】带有白色背景且未集中的 PHP 缩略图【英文标题】:PHP thumbnail with white background and not centralized 【发布时间】:2019-05-21 00:05:24 【问题描述】:

上传图片后,我有以下 php 脚本来创建缩略图。它工作正常,但是它会创建一个黑色背景并且如果它不是您想要的大小,它不会使图像居中,有谁知道如何离开白色背景并将其居中?

如何解决 https://imgur.com/a/uTrPadZ

if($_SERVER['REQUEST_METHOD']=='POST')

$filetmp = $_FILES["image"]["tmp_name"];
$filename = $_FILES["image"]["name"];
$filetype = $_FILES["image"]["type"];
$filesize = $_FILES["image"]["size"];
$fileinfo = getimagesize($_FILES["image"]["tmp_name"]);
$filewidth = $fileinfo[0];
$fileheight = $fileinfo[1];
$filepath = "../uploads/";
$filepath_thumb = "../thumbnail/";

if($filetmp == "")

    echo "please select a photo";

else


    if($filesize > 2097152)
    
        echo "photo > 2mb";
    
    else
    

        if($filetype != "image/jpeg" && $filetype != "image/png" && $filetype != "image/gif")
        
            echo "Please upload jpg / png / gif";
        
        else
        
            $final_image = rand(1000,1000000).$filename;
            $filepath = $filepath.strtolower($final_image);
            move_uploaded_file($filetmp,$filepath);             

            if($filetype == "image/jpeg")
            
              $imagecreate = "imagecreatefromjpeg";
              $imageformat = "imagejpeg";
            
            if($filetype == "image/png")
                                    
              $imagecreate = "imagecreatefrompng";
              $imageformat = "imagepng";
            
            if($filetype == "image/gif")
                                    
              $imagecreate= "imagecreatefromgif";
              $imageformat = "imagegif";
            

            $new_width = "200";
            $new_height = "200";


            $filepath_thumb = $filepath_thumb.strtolower($final_image);
            $image_p = imagecreatetruecolor($new_width, $new_height);
            $image = $imagecreate($filepath); //photo folder
            if($filewidth > $fileheight) 
            
                $thumb_w    =   $new_width;
                $thumb_h    =   $fileheight*($new_height/$filewidth);
            

            if($filewidth < $fileheight) 
            
                $thumb_w    =   $filewidth*($new_width/$fileheight);
                $thumb_h    =   $new_height;
            

            if($filewidth == $fileheight) 
            
                $thumb_w    =   $new_width;
                $thumb_h    =   $new_height;
            

            $dst_img        =   ImageCreateTrueColor($thumb_w,$thumb_h);

            imagecopyresampled($image_p,$image,0,0,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

            $imageformat($image_p, $filepath_thumb);//thumb folder      



        

    


【问题讨论】:

【参考方案1】:

默认背景为黑色,您只需将新图像的背景颜色设置为白色即可。

//set background colour white before copying
$white = imagecolorallocate($image_p, 255, 255, 255);
imagefill($image_p, 0, 0, $white);

imagecopyresampled($image_p,$image,0,0,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

$imageformat($image_p, $filepath_thumb);//thumb folder

另外,似乎没有使用 $dst_img。

居中(未经测试,但数学足够简单):

$xOffset = (imagesx($p_image)-$thumb_w) / 2;
$yOffset = (imagesy($p_image)-$thumb_h) / 2;

imagecopyresampled($image_p,$image,$offsetX,$offsetY,0,0,$thumb_w,$thumb_h,$filewidth,$fileheight);

如果您知道哪个尺寸与新的缩略图尺寸不匹配,这可以简化。

【讨论】:

非常感谢背景变白了,但是如何使图像居中? 使图像居中是非常简单的数学运算。 $xOffset = (imagesx($image)-imagesx($p_image)) / 2; $yOffset = (imagesy($image)-imagesy($p_image)) / 2;并将当前为 0,0 的目标 x,y 设置为 imagecopyresampled 中的偏移量。 (我也会更新帖子) 我使用了你的代码,但是出现了两个问题。我把 $ xOffset 放在 if ($ filewidth $ fileheight) 里面,因为这是唯一的工作方法,但是当它发生时 if ($ filewidth imgur.com/a/KxfpKC7 并保持在右侧。当我使用 if ($ filewidth> $ fileheight) 时,一切都变白了! 如果您不使用发布的代码,我很难猜出哪里出了问题。请更新您的原始版本或添加经过编辑的版本。 我想我误解了 $image 的大小,尝试编辑版本区分缩略图和缩略图图像内容而不是 2 个图像。

以上是关于带有白色背景且未集中的 PHP 缩略图的主要内容,如果未能解决你的问题,请参考以下文章

带有黑色背景的 alpha 图像绘制其他白色...?

golang https://www.v2ex.com/t/303711基于微信显示png图片缩略图背景为白色,放大后背景图为黑色的Bug

从 Bootstrap 3 的缩略图中删除烦人的白色背景

php使用GD库实现图片水印和缩略图——给图片添加图片水印

php 将后缩略图作为背景图像添加到任何div

使用 Imagick 转换透明 PDF 文件