这个坑这几天必须给填掉...

2012-11-24 14:20:44 +08:00
 lhj2100
原帖在 http://www.v2ex.com/t/38590


从一个页面上传一个图片 文件 JPG bmp 图片限制2M以内
然后用PHP 处理图片 分析图片尺寸 若图片为800*600 则分割成198*198的图片 12个 并显示出来

每张图片抛弃2px;
第一张图片对应原图片 左上角0,0,右下角198,198,第2张图片左上角200,0 右下角398,198

因为我对PHP不熟悉 网上又找不到类似的代码可供研究 又或者是SAE 的运行环境比较另类

我在某个代码上卡住了

isfeel.sinaapp.com/upload/index.html

上传后生成的图片有黑色的边 而不是我想要的效果

代码如下
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>html5 example: IMG Preview</title>
</head>
<body>
<?php
$s = new SaeStorage();
$name =$_FILES['viewFiles']['name'];

if ((($_FILES["viewFiles"]["type"] == "image/gif")
|| ($_FILES["viewFiles"]["type"] == "image/jpeg")
|| ($_FILES["viewFiles"]["type"] == "image/pjpeg"))
&& ($_FILES["viewFiles"]["size"] < 2000000))
{
if ($_FILES["viewFiles"]["error"] > 0)
{
echo "错误代码: " . $_FILES["viewFiles"]["error"] . "<br />";
}
else
{
echo "文件名称: " . $_FILES["viewFiles"]["name"] . "<br />";
echo "文件类型: " . $_FILES["viewFiles"]["type"] . "<br />";
echo "占用空间: " . ($_FILES["viewFiles"]["size"] / 1024) . " Kb<br />";
echo "缓存地址: " . $_FILES["viewFiles"]["tmp_name"] . "<br />";
$tmpfile=$_FILES["viewFiles"]["tmp_name"];
$tempcache=$_FILES["viewFiles"]["tmp_name"];

list($current_width, $current_height) = getimagesize($tmpfile);
echo "图片尺寸:".$current_width."X".$current_height."<br/>";
echo "操作完成..<br/>";

if ($current_width>200 || $current_width<2500 || $current_height>200 || $current_height<1500)
{

$left = 0;
$top = 0;

$crop_width = 198;
$crop_height = 198;


for ($i =1; $i<=9;$i++)
{

$canvas =imagecreatetruecolor($crop_width, $crop_height);

$current_image =imagecreatefromjpeg($tmpfile);
imagecopy($canvas, $current_image, 0, 0, $left, $top,$current_width, $current_height);

imagejpeg($canvas,$tempcache,85);

$targetfile=$i.".jpg";
$s->upload("upload",$targetfile,$tempcache);
$imgurl=$s->getUrl("upload",$targetfile);
echo "<img src='".$imgurl."?".time()."'/>";
imagedestroy($canvas);
imagedestroy($current_image);

$left+=3;
$top+=3;

}
}
else
{
echo "图片宽度小于200 或 大于3500像素";
echo "图片高度小于200 或 大于3500像素";
echo $current_width.$current_height;
}


//}
}
}
else
{
echo "图片不符合规范 JPG 2M字节以下";
}
?>
</body>
</html>

经过UPlaod.php处理的图片 是有黑边的
事情进行到这里就彻底卡住了 进行不下去了
然后又去玩网游去了


直到今天才想起来 还有这个坑没填上
所以想请V2ex上的朋友帮帮忙
要是再让我回到网游上边去 可能又要几个月才想得起来了
我这里 召唤一些大神们
@CoX
@zythum
@liyandong
@liyandong
@no2x
@galaxy11
@shiren1118
@twor2
@shiren1118
@blank_dlh
@jo32
@flyingnn
@jo32
@javaluo
@xmbaozi
@66
@wdd2007
@chaojie
@shiren1118
@66
@Even
@l0wkey
@yujnln
@Bob
4584 次点击
所在节点    PHP
12 条回复
Bob
2012-11-24 20:28:29 +08:00
我都成大牛了---作惊恐状
菜鸟中菜鸟回答不了你上面的问题
另外你的链接打不开
lhj2100
2012-11-24 21:25:17 +08:00
我并不是想有谁能够给我直接的答案 只是不太理解关键几句代码的执行方式
想找个高手来帮忙指导一下
$canvas =imagecreatetruecolor($crop_width, $crop_height);
$current_image =imagecreatefromjpeg($tmpfile);
imagecopy($canvas, $current_image, 0, 0, $left, $top,$current_width, $current_height);
imagejpeg($canvas,$tempcache,85);

javaluo
2012-11-24 21:45:24 +08:00
http://bbs.9ria.com/thread-19017-1-1.html
需要背景透明?

PS: 我不是大神 - -
chaojie
2012-11-24 21:52:31 +08:00
imagecreatetruecolor() 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的黑色图像。
看到黑色了吧?

$left+=3;
$top+=3;
这当然只能是你的效果,因为它是3

imagejpeg($canvas,$tempcache,85)
貌似你在循环时把文件覆盖成新的小图了
lhj2100
2012-11-24 22:01:11 +08:00
@chaojie 原图像 不是$current_image 这个变量保存着的吗?
chaojie
2012-11-24 22:04:05 +08:00
$current_image =imagecreatefromjpeg($tmpfile);
你写在for里面了


@javaluo 这个是flex的
lhj2100
2012-11-24 22:10:55 +08:00
我把我对代码的理解说一下 您看对不对

$canvas =imagecreatetruecolor($crop_width, $crop_height);
//此时$canvas 是一个黑色的198×198的图片

$current_image =imagecreatefromjpeg($tmpfile);
//此时$current_image 是我上传的那张图片

imagecopy($canvas, $current_image, 0, 0, $left, $top,$current_width, $current_height);

//这里将我上传的那张图片 切割 从$left ,$top到$current_width ,$current_height 那一部分切割下来 安在 $canvas 的0,0 位置

imagejpeg($canvas,$tempcache,85);
//这里将 $canvas 图片 以85%的质量 复制给$tempcache

@chaojie 对吗
lhj2100
2012-11-24 22:15:00 +08:00
@chaojie

$current_image =imagecreatefromjpeg($tmpfile);

$tmpfile 一直都在变化着的么?

$tmpfile 在for 里就不是 $_FILES["viewFiles"]["tmp_name"]; 的值了么?
chaojie
2012-11-24 22:22:33 +08:00
filepath only

$tmpfile=$_FILES["viewFiles"]["tmp_name"];
$tempcache=$_FILES["viewFiles"]["tmp_name"];

变量虽不同,是同一个字符串
lhj2100
2012-11-24 22:25:37 +08:00
试着将
$canvas =imagecreatetruecolor($crop_width, $crop_height);

$current_image =imagecreatefromjpeg($tmpfile);


imagedestroy($canvas);
imagedestroy($current_image);

移动到循环之外就解决问题 了..
但是还是不理解...
lhj2100
2012-11-24 22:32:57 +08:00
@chaojie
赋值是从右往左的吧
$tmpfile=$_FILES["viewFiles"]["tmp_name"];

$tempcache=$_FILES["viewFiles"]["tmp_name"];

不过好像我用的时候在最后 将$tempcache 这个字符变量 强制转换成了一个图像对象
就是这一句
imagejpeg($canvas,$tempcache,85);
这一句结束之后 $tempcache 是个什么类型的变量
如果不再是字符型
如何事先实现声明一个对象 装载 该句的运行结果..
lhj2100
2012-11-30 11:17:47 +08:00
终于填完了 就不另外开贴宣传了
地址在 http://isfeel.sinaapp.com/upload/
IE什么的访问有问题
CHORME 就没问题...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/53204

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX