首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

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

  •  
  •   lhj2100 · 2012-11-24 14:20:44 +08:00 · 3566 次点击
    这是一个创建于 2545 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原帖在 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
    12 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    Bob   2012-11-24 20:28:29 +08:00   ♥ 1
    我都成大牛了---作惊恐状
    菜鸟中菜鸟回答不了你上面的问题
    另外你的链接打不开
        2
    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);

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

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

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

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


    @javaluo 这个是flex的
        7
    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 对吗
        8
    lhj2100   2012-11-24 22:15:00 +08:00
    @chaojie

    $current_image =imagecreatefromjpeg($tmpfile);

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

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

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

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

    $current_image =imagecreatefromjpeg($tmpfile);


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

    移动到循环之外就解决问题 了..
    但是还是不理解...
        11
    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 是个什么类型的变量
    如果不再是字符型
    如何事先实现声明一个对象 装载 该句的运行结果..
        12
    lhj2100   2012-11-30 11:17:47 +08:00
    终于填完了 就不另外开贴宣传了
    地址在 http://isfeel.sinaapp.com/upload/
    IE什么的访问有问题
    CHORME 就没问题...
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3373 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 04:43 · PVG 12:43 · LAX 20:43 · JFK 23:43
    ♥ Do have faith in what you're doing.