【问题标题】:Transparancy Background PNG for upload function上传功能的透明背景PNG
【发布时间】:2017-10-11 05:55:39
【问题描述】:

我在上传透明背景的png图片时遇到问题,结果是黑色背景。我想要的只是在上传 png 透明背景后,结果将与原始文件相同。 这里是函数的代码

上传.php

function upload_sponsors($nama_file,$folder,$lokasi_file,$lebar,$tinggi){
$nama_folder = "../../../$folder/";
$ext = end((explode(".", $nama_file))); # extra () to prevent notice
list($lebar_asli, $tinggi_asli, $source_type) = getimagesize($lokasi_file);
if ($ext == "gif"){
    $gambar_asli = imagecreatefromgif($lokasi_file);
} else if($ext =="png"){
    $gambar_asli = imagecreatefrompng($lokasi_file);
} else {
    $gambar_asli = imagecreatefromjpeg($lokasi_file);
}

$ukuran_asli = $lebar_asli / $tinggi_asli;
$ukuran = $lebar / $tinggi;
if ($ukuran_asli > $ukuran) {
    $tinggi_sementara = $tinggi;
    $lebar_sementara = ( int ) ($tinggi * $ukuran_asli);
} else {
    /*jika gambar sama atau lebih tinggi*/
    $lebar_sementara = $lebar;
    $tinggi_sementara = ( int ) ($lebar / $ukuran_asli);
}
$gambar_sementara = imagecreatetruecolor($lebar_sementara, $tinggi_sementara);
imagecopyresampled($gambar_sementara,$gambar_asli,0, 0,0, 0,$lebar_sementara, $tinggi_sementara,$lebar_asli, $tinggi_asli);
/*Copy cropped region from temporary image into the desired GD image*/
$x_absis = ($lebar_sementara - $lebar) / 2;
$y_absis = ($tinggi_sementara - $tinggi) / 2;
$gambar_akhir = imagecreatetruecolor($lebar, $tinggi);
imagecopy($gambar_akhir,$gambar_sementara,0, 0,$x_absis, $y_absis,$lebar, $tinggi);

if ($ext == "gif"){
    imagegif($gambar_akhir,$nama_folder.$nama_file);
} else if($ext =="png"){
    imagepng($gambar_akhir,$nama_folder.$nama_file);
} else {
    imagejpeg($gambar_akhir,$nama_folder.$nama_file);
}

imagedestroy($gambar_akhir);
}

那么这就是表单上传提交后的动作

action.php

include "../../config/upload.php";
$module=$_GET['module'];
$act=$_GET['act'];
if ($module=='sponsors' AND $act=='input'){
    $ukuran_maksimal        = 30000000;
    $acak                   = rand(0000,9999);
    $image_info = getimagesize($_FILES["fupload"]["tmp_name"]);
    $lebar = $image_info[0];    // width of image
    $tinggi = $image_info[1];    // height of image
    //$lebar                = 800;
    //$tinggi                   = 534;

    //$fold                 = $_POST['folder'];
    $id_kategori            = $_POST['id_kategori_blog'];
    $folder                 = "images/";
    $lokasi_file            = $_FILES['fupload']['tmp_name'];
    $tipe_file              = $_FILES['fupload']['type'];
    $nama_file              = $_FILES['fupload']['name'];
    $ukuran_file            = $_FILES['fupload']['size'];
    $nama_file              = str_replace(' ', '_', $nama_file);
    $nama_file              = $acak.$nama_file;

    upload_sponsors($nama_file,$folder,$lokasi_file,$lebar,$tinggi);

                mysql_query("INSERT INTO sponsors(judul,link,isi,gambar) 
                                         VALUES('$_POST[judul]','$_POST[link]','$_POST[isi]','$nama_file')");
                echo "<script>window.alert('Upload image succes');
                window.location=('../../main.php?module=sponsors')</script>";

}

【问题讨论】:

    标签: javascript php css mysql


    【解决方案1】:

    你需要用透明颜色填充画布,然后再重新采样,如下所示:

    imagefill( $gambar_sementara, 0, 0, 0x7fff0000);
    

    0x7fff0000 是完全透明颜色的十六进制代码字符串。你也可以使用imagecolorallocatealpha()来构建透明色。

    还需要使用imagesavealpha()来开启alpha通道。

    在您的代码中:

    $gambar_sementara = imagecreatetruecolor($lebar_sementara, $tinggi_sementara);
    imagesavealpha($gambar_sementara, true);
    imagefill( $gambar_sementara, 0, 0, 0x7fff0000);
    imagecopyresampled($gambar_sementara,$gambar_asli,0, 0,0, 0,$lebar_sementara, $tinggi_sementara,$lebar_asli, $tinggi_asli);
    

    再往下:

    $gambar_akhir = imagecreatetruecolor($lebar, $tinggi);
    imagesavealpha($gambar_akhir, true);
    imagefill( $gambar_akhir, 0, 0, 0x7fff0000);
    imagecopy($gambar_akhir,$gambar_sementara,0, 0,$x_absis, $y_absis,$lebar, $tinggi);
    

    见:

    http://php.net/manual/en/function.imagefill.php http://php.net/manual/en/function.imagesavealpha.php http://php.net/manual/en/function.imagecolorallocatealpha.php

    【讨论】:

    • @AgnesPuspasari 我做了更新 - 你需要在两个地方(现在见上文)每次创建新的图像资源时,都需要填充它以提高透明度
    • 嗨,是的,背景变为红色,因为脚本 fff0000 如果我必须更改为透明怎么办?
    • 抱歉,我又错过了一个电话:imagesavealpha()。再次参见上面@AgnesPuspasari :)
    猜你喜欢
    • 2013-12-10
    • 2011-12-04
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多