我弄了一个上传图片 自动加水印和文字的程序 但是传大图片 无法生成

qq_30871693 2016-09-02 09:40:33
我弄了一个上传图片后,可以生成带水印,带名字的生成图片程序,但是在图片大于3.5MB后,可以上传图片到服务器,但是无法生成带水印的图片
主要三个文件
index.php
sc.php
toutu.php
up.php

目前上传小图片都可以正常生成
但是上传超过3.5MB以上的图片,图片可以上传到服务器,但是无法生成带水印图片



代码如下:
index.php

<!DOCTYPE html>
<html lang="en">
<head>
<div id='wx_pic' style='margin:0 auto;display:none;'>
<img src='1.png' />
</div>

<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<title>图片自动加水印程序</title>
<link type="text/css" rel="stylesheet" href="frozen.css" />
<style>
body{color:#a6a6a6; font-size:16px; padding-top:45px;}
body b{color: #00A5E3}
body>a{display:none;}
h2.title {line-height: 45px;font-size: 20px;color: #FF0000;position: fixed;top: 0;height: 45px;-webkit-box-sizing: border-box;width: 100%;z-index: 9999;background-color: #f8f9fa;text-align:center;}
.pr5{padding-bottom:45px;}
.pr5 p{margin-bottom:5px;}
.ui-list{background-color:#f8f9fa;padding-bottom:5px}
#mcover{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.7);display:none;z-index:20000;}
#mcover img{position:fixed;right: 18px;top:5px;width:260px;height:180px;z-index:20001;}
</style>

</head>

<body ontouchstart="">
<h2 class="title ui-border-b">图片自动加水印程序</h2>
<div class="wrapper">
<img src="icon2.jpg" width="50%" style="margin:80px 25% 80px 25%;"/>
<div class="ui-form">
<div class="file-box">

<form action="up.php" method="post" enctype="multipart/form-data">
<div class="ui-form-item ui-border-b">
<label for="#">输入姓名</label>
<input type="text" name="name1" placeholder="最多显示10个字"/>
<label for="#">头像jpg</label>
<input type="file" name="file" value="限jpg图片"/>
</div>
<br />
<br />
<br />
<div class="ui-btn-wrap">

<button class="ui-btn-lg ui-btn-danger">下一步</button>
</div>

</form>


</div>
</div>

<script type="text/javascript" src="../zepto.min.js"></script>
<script type="text/javascript" src="../frozen.js"></script>


</body>
</html>


toutu.php

<?php
/******************************************************************************

******************************************************************************/

//上传文件类型列表
$uptypes=array(
'image/jpg',
'image/jpeg',
'image/png',
'image/pjpeg',
'image/gif',
'image/bmp',
'image/x-png'
);

$max_file_size=2000000;
$destination_folder="";
$imgpreview=1;
$imgpreviewsize=1/2;
?>
<?php
$xingbie = $_GET['xingbie']?$_GET['xingbie']:"2.jpg";


$src_img = $xingbie;

list($src_w, $src_h) = getimagesize($src_img);
$dst_h=680;
$dst_w=742;
$dst_scale = $dst_h/$dst_w;
$src_scale = $src_h/$src_w;
if($src_scale>=$dst_scale)
{

$w = intval($src_w);
$h = intval($dst_scale*$w);
$x = 0;
$y = ($src_h - $h)/3;
}
else
{

$h = intval($src_h);
$w = intval($h/$dst_scale);
$x = ($src_w - $w)/2;
$y = 0;
}

$source=imagecreatefromjpeg($src_img);
$croped=imagecreatetruecolor($w, $h);
imagecopy($croped,$source,0,0,$x,$y,$src_w,$src_h);

$scale = $dst_w/$w;
$target = imagecreatetruecolor($dst_w, $dst_h);
$final_w = intval($w*$scale);
$final_h = intval($h*$scale);
imagecopyresampled($target,$croped,0,0,0,0,$final_w,$final_h,$w,$h);

$timestamp = time();
imagejpeg($target, "$timestamp.jpg");
imagedestroy($target);

$dst_path = 'toutuaq1.jpg';
$src_path = "$timestamp.jpg";

$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));

list($src_w, $src_h) = getimagesize($src_path);

imagecopymerge($dst, $src, 0, 0, 0, 0,$src_w, $src_h, 100);


$timestamp1 = time();
imagejpeg($dst, "$timestamp1.jpg");
imagedestroy($dst);


$name = $_GET['name']?$_GET['name']:"图片水印";
$a1 = mb_substr($name,0,10,'utf-8');

header("content-type:image/jpeg");
$im = imagecreatetruecolor(742, 989);
$bg = imagecreatefromjpeg("$timestamp1.jpg");

imagecopy($im,$bg,0,0,0,0,742,989);
imagedestroy($bg);
$black = imagecolorallocate($im, 0, 0, 0);
$text1 = $a1;

$font = 'fh.ttf';
imagettftext($im, 30, 0, 220, 660, $black, $font, $text1);

list($dst_w, $dst_h, $dst_type) = getimagesize("toutuaq1.jpg");
switch ($dst_type) {
case 1://GIF
header('Content-Type: image/gif');
imagegif($im);
break;
case 2://JPG
header('Content-Type: image/jpeg');
imagejpeg($im);
break;
case 3://PNG
header('Content-Type: image/png');
imagepng($im);
break;
default:
break;
}

$timestamp2 = time();
imagejpeg($im,"$timestamp2.jpg");
imagedestroy($im);


?>



sc.php

<!doctype html>


<?php
/******************************************************************************

参数说明:
$max_file_size : 上传文件大小限制, 单位BYTE
$destination_folder : 上传文件路径
$watermark : 是否附加水印(1为加水印,其他为不加水印);

使用说明:
1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库;
2. 将extension_dir =改为你的php_gd2.dll所在目录;
******************************************************************************/

//上传文件类型列表
$uptypes=array(
'image/jpg',
'image/jpeg',
'image/png',
'image/pjpeg',
'image/gif',
'image/bmp',
'image/x-png'
);

$max_file_size=2000000; //上传文件大小限制, 单位BYTE
$destination_folder=""; //上传文件路径
$imgpreview=1; //是否生成预览图(1为生成,其他为不生成);
$imgpreviewsize=1/2; //缩略图比例
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>图片上传</title>
<meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<style type="text/css">
<!--
body
{
font-size: 9pt;
}
input
{
background-color: #66CCFF;
border: 1px inset #CCCCCC;
}
-->
</style>
<style type="text/css">
body{ font-size:14px;}
input{ vertical-align:middle; margin:0; padding:0}
.file-box{ position:relative;width:340px}
.txt{ height:22px; border:1px solid #cdcdcd; width:180px;}
.btn{ background-color:#FFF; border:1px solid #CDCDCD;height:24px; width:70px;}
.file{ position:absolute; top:0; right:80px; height:24px; filter:alpha(opacity:0);opacity: 0;width:260px }
</style>



</head>

<body>
<div class="file-box">
<form action="" method="post" enctype="multipart/form-data">
<input type='text' name='textfield' id='textfield' class='txt' />
<input type='button' class='btn' value='浏览...' />
<input type="file" name="upfile" class="file" id="fileField" size="28" onchange="document.getElementById('textfield').value=this.value" />
<input type="submit" name="submit" class="btn" value="上传" />
</form>
</div>


</body>
</html>


up.php

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<title>图片自动生成程序</title>
<link type="text/css" rel="stylesheet" href="frozen.css" />
<style>
body{color:#a6a6a6; font-size:16px; padding-top:45px;}
body b{color: #00A5E3}
body>a{display:none;}
h2.title {line-height: 45px;font-size: 20px;color: #FF0000;position: fixed;top: 0;height: 45px;-webkit-box-sizing: border-box;width: 100%;z-index: 9999;background-color: #f8f9fa;text-align:center;}
.pr5{padding-bottom:45px;}
.pr5 p{margin-bottom:5px;}
.ui-list{background-color:#f8f9fa;padding-bottom:5px}
#mcover{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.7);display:none;z-index:20000;}
#mcover img{position:fixed;right: 18px;top:5px;width:260px;height:180px;z-index:20001;}
</style>

</head>
<body>

<h2 class="title ui-border-b"><a href="/">长按下图保存图片</a></h2>
<br/>
<?php
$name1 = $_POST['name1'];
$xingbie = $_FILES["file"]["name"];

$file = $_FILES['file'];//得到传输的数据
//得到文件名称
$name = $file['name'];
$type = strtolower(substr($name,strrpos($name,'.')+1)); //得到文件类型,并且都转化成小写
$allow_type = array('jpg','jpeg','gif','png');
//定义允许上传的类型//判断文件类型是否被允许上传
if(!in_array($type, $allow_type)){
//如果不被允许,则直接停止程序运行
return ;}
//判断是否是通过HTTP POST上传的
if(!is_uploaded_file($file['tmp_name'])){
//如果不是通过HTTP POST上传的
return ;}
$upload_path = "";
//上传文件的存放路径
//开始移动文件到相应的文件夹
if(move_uploaded_file($file['tmp_name'],$upload_path.$file['name'])){

}else{

}
?>
<div class="wrapper">
<img src="toutu.php?name=<?php echo $name1?>&xingbie=<?php echo $xingbie?>" width="100%"/>
</div>

<script type="text/javascript" src="../zepto.min.js"></script>
<script type="text/javascript" src="../frozen.js"></script>

</body>

</html>


请教大家了!
...全文
652 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
缩略 是以丢失分辨率为代价的
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
乘 4 是因为每个像素点由 通道(透明度)、红色、绿色、蓝色 4 个字节组成 计算的是展开的大小,压缩后大约 4~5M(画面与复杂,体积越大)
还有个问题要咨询老大,生成的缩略图的清晰度是调整那个参数?
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
乘 4 是因为每个像素点由 通道(透明度)、红色、绿色、蓝色 4 个字节组成 计算的是展开的大小,压缩后大约 4~5M(画面与复杂,体积越大)
老大 在您的点拨下,搞定了,我计算图片大小错误造成的,没有深刻理解乘以四的意义,现在我把memory_limit调整为256M,通吃所有目前的相机的图片,单反原图都可以!
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
乘 4 是因为每个像素点由 通道(透明度)、红色、绿色、蓝色 4 个字节组成 计算的是展开的大小,压缩后大约 4~5M(画面与复杂,体积越大)
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
4500 * 3000 * 4 = 54000000 即 54M 显然与你的说法不同!
我把图片大小修改为5000X3333 的分辨率 上传就生成不了缩略图了,
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
4500 * 3000 * 4 = 54000000 即 54M 显然与你的说法不同!
为何要乘以4 得到54MB?
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
当然,如果你的 gd 不认识新的图片格式,那就两说了
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
4500 * 3000 * 4 = 54000000 即 54M 显然与你的说法不同!
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
这只与图片的分辨率有关,因为 gd 需要将图片全部展开到内存,如果内存不足就会失败 但除了加内存条都不是你自己能解决的,所以你只能测试出最值后,放弃缩略(可以手工处理的)
目前图片大小4500X3000,图片大小7.84MB都没有问题。
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
这只与图片的分辨率有关,因为 gd 需要将图片全部展开到内存,如果内存不足就会失败 但除了加内存条都不是你自己能解决的,所以你只能测试出最值后,放弃缩略(可以手工处理的)
刚才测试了 目前 4500X3000的分辨率都没有问题,
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
这只与图片的分辨率有关,因为 gd 需要将图片全部展开到内存,如果内存不足就会失败 但除了加内存条都不是你自己能解决的,所以你只能测试出最值后,放弃缩略(可以手工处理的)
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你有 $max_file_size=2000000; //上传文件大小限制, 单位BYTE 自然传不了 3.5M 的文件 你的 gd 能处理到多大的图片,你测试过了吗?
貌似好像还有别的什么地方不明的参数在控制着缩略图的大小,哎!
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你有 $max_file_size=2000000; //上传文件大小限制, 单位BYTE 自然传不了 3.5M 的文件 你的 gd 能处理到多大的图片,你测试过了吗?
这个地方的设置我测试过了,好像没有用,我修改为8000000,也是这个错误,目前系统支持的最大图片大约是3.5MB以内的都可以,但是超过3.5以上左右的可以上传,但是无法生成带水印的缩略图。
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
你有 $max_file_size=2000000; //上传文件大小限制, 单位BYTE 自然传不了 3.5M 的文件 你的 gd 能处理到多大的图片,你测试过了吗?
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
当图片尺寸查过 1024 * 768 时,gd 就可能打不开(与可用内存有关) 你可在你的环境中测试一下,上限是多少
我查过了,php.ini的配置中memory_limit = 128M ,很大了啊!
xuzuning 2016-09-02
  • 打赏
  • 举报
回复
当图片尺寸查过 1024 * 768 时,gd 就可能打不开(与可用内存有关) 你可在你的环境中测试一下,上限是多少
qq_30871693 2016-09-02
  • 打赏
  • 举报
回复
就是说 如何修改下,变成对上传的图片不限制大小,因为都是手机上传,目前手机拍摄的图片都很大。

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧