0

0

搞了两天,没弄成,宣布失败,求高手帮忙!!

php中文网

php中文网

发布时间:2016-06-23 14:14:04

|

878人浏览过

|

来源于php中文网

原创

下面这个代码,是可以直接把图片处理为四个角都为园的。
但是现在产生的图片是没生成文件的,想改为处理的文件可以生成一个在指定目录。。
弄了两天,总是不行。。。求高手帮忙看看。。谢谢!
例如运行网址:http://www.xxx.com/pic.php?gopic=1234.jpg

pic.php代码如下:

<?php  class RoundedCorner {      private $_r;      private $_g;      private $_b;      private $_image_path;      private $_radius;           function __construct($image_path, $radius, $r = 255, $g = 255, $b = 255) {           $this->_image_path = $image_path;          $this->_radius = $radius;          $this->_r = (int)$r;          $this->_g = (int)$g;          $this->_b = (int)$b;      }            private function _get_lt_rounder_corner() {          $radius = $this->_radius;          $img = imagecreatetruecolor($radius, $radius);          $bgcolor = imagecolorallocate($img, $this->_r, $this->_g, $this->_b);          $fgcolor = imagecolorallocate($img, 0, 0, 0);          imagefill($img, 0, 0, $bgcolor);          imagefilledarc($img, $radius, $radius, $radius*2, $radius*2, 180, 270, $fgcolor, IMG_ARC_PIE);          imagecolortransparent($img, $fgcolor);          return $img;      }            private function _load_source_image() {          $ext = substr($this->_image_path, strrpos($this->_image_path, '.'));          if (empty($ext)) {              return false;             }          switch(strtolower($ext)) {              case '.jpg':                  $img = @imagecreatefromjpeg($this->_image_path);                  break;              case '.gif':                  $img = @imagecreatefromgif($this->_image_path);                  break;              case '.png':                  $img = @imagecreatefrompng($this->_image_path);                  break;              default:                  return false;          }          return $img;                }            public function round_it() {          // load the source image          $src_image = $this->_load_source_image();          if ($src_image === false) {              die('错误:图片不存在');           }          $image_width = imagesx($src_image);          $image_height = imagesy($src_image);                    // create a new image, with src_width, src_height, and fill it with transparent color          $image = imagecreatetruecolor($image_width, $image_height);          $trans_color = imagecolorallocate($image, $this->_r, $this->_g, $this->_b);          imagefill($image, 0, 0, $trans_color);                    // then overwirte the source image to the new created image          imagecopymerge($image, $src_image, 0, 0, 0, 0, $image_width, $image_height, 100);                    // then just copy all the rounded corner images to the 4 corners          $radius = $this->_radius;          // lt          $lt_corner = $this->_get_lt_rounder_corner();          imagecopymerge($image, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100);          // lb          $lb_corner = imagerotate($lt_corner, 90, $trans_color);          imagecopymerge($image, $lb_corner, 0, $image_height - $radius, 0, 0, $radius, $radius, 100);          // rb          $rb_corner = imagerotate($lt_corner, 180, $trans_color);          imagecopymerge($image, $rb_corner, $image_width - $radius, $image_height - $radius, 0, 0, $radius, $radius, 100);          // rt          $rt_corner = imagerotate($lt_corner, 270, $trans_color);          imagecopymerge($image, $rt_corner, $image_width - $radius, 0, 0, 0, $radius, $radius, 100);                    // set the transparency          imagecolortransparent($image, $trans_color);          // display it          header('Content-Type: image/png');          imagepng($image);                    imagedestroy($src_image);          imagedestroy($image);          imagedestroy($lt_corner);          imagedestroy($lb_corner);          imagedestroy($rb_corner);          imagedestroy($rt_corner);      }   }  $rounder = new RoundedCorner($_GET['gopic'], 20);  $rounder->round_it();  ?>

回复讨论(解决方案)

哥们,保存图片请用saveas() 这样就可以放在指定的目录下了

本帖最后由 xuzuning 于 2013-06-23 19:07:04 编辑

public function round_it( $filename='') {
  ....
        header('content-type: image/png');  
        if($filename) imagepng($image, $filename);  
        else imagepng($image);
        imagedestroy($src_image);  
        imagedestroy($image);  
        imagedestroy($lt_corner);  
        imagedestroy($lb_corner);  
        imagedestroy($rb_corner);  
        imagedestroy($rt_corner);  
}    

public function round_it( $filename='') {
  ....
        header('content-type: image/png');  
        if($filename) imagepng($image, $filename);  
        else imagepng($image);
        imagedestroy($src_image);  
        imagedestroy($image);  
        imagedestroy($lt_corner);  
        imagedestroy($lb_corner);  
        imagedestroy($rb_corner);  
        imagedestroy($rt_corner);  
}    

版主。。你这个是替换吗?我弄了不行啊。。
能不能直接给我一个完整的?

哥们,保存图片请用saveas() 这样就可以放在指定的目录下了
思路我知道,具体代码如何写才好?帮忙整一下啊。。我弄了总不行。。

一样无法保存图片在目录里。

public function round_it( $filename='') {
  ....
        header('content-type: image/png');  
        if($filename) imagepng($image, $filename);  
        else imagepng($image);
        imagedestroy($src_image);  
        imagedestroy($image);  
        imagedestroy($lt_corner);  
        imagedestroy($lb_corner);  
        imagedestroy($rb_corner);  
        imagedestroy($rt_corner);  
}    

使用版主的修改,然后调用的时候
$rounder->round_it( 你要保存的目录);  


imagepng($image);  
改为
imagepng($image,$src_image);  
试试

上面的错了,是应该改成把
imagepng($image);  
改为
imagepng($image,$this->_image_path);
看错了

只要把把
imagepng($image);  
改为
imagepng($image,$this->_image_path);
就好了
其他的都不要变

只要把把
imagepng($image);  
改为
imagepng($image,$this->_image_path);
就好了
其他的都不要变

我试了不行,连图片都不会显示出来。
还是我代码搞错了?版主之间贴改好的给我看吧?
不然这样,我套代码也有可能是我自己搞错??


public function round_it( $filename='') {
  ....
        header('content-type: image/png');  
        if($filename) imagepng($image, $filename);  
        else imagepng($image);
        imagedestroy($src_image);  
        imagedestroy($image);  
        imagedestroy($lt_corner);  
        imagedestroy($lb_corner);  
        imagedestroy($rb_corner);  
        imagedestroy($rt_corner);  
}    

使用版主的修改,然后调用的时候
$rounder->round_it( 你要保存的目录);  

也不行呐、、搞得我都乱了。。求直接贴出代码啊。。谢谢啊!

没人帮忙了吗?
总是按你们说的,都搞了总不行啊。。。


只要把把
imagepng($image);  
改为
imagepng($image,$this->_image_path);
就好了
其他的都不要变

我试了不行,连图片都不会显示出来。
还是我代码搞错了?版主之间贴改好的给我看吧?
不然这样,我套代码也有可能是我自己搞错??

不行才怪,我测试了可以正常的


这个是我用你的程序之前的图片

下面这个是用你程序之后的图片

倒,2个图搞颠倒了

第一个是用你程序处理过的
下面那个是原图

倒,2个图搞颠倒了

第一个是用你程序处理过的
下面那个是原图
我试了真的不行呐。。。你会不会前面代码给错我了???
你还是直接把代码贴出来吧。。我难道还忽悠你不好吗?真的弄了用不行。。。
贴出来吧,然后结贴了。。

bool imagepng ( resource image [, string filename] )

imagepng() 将 GD 图像流(image)以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。 


倒,2个图搞颠倒了

第一个是用你程序处理过的
下面那个是原图
我试了真的不行呐。。。你会不会前面代码给错我了???
你还是直接把代码贴出来吧。。我难道还忽悠你不好吗?真的弄了用不行。。。
贴出来吧,然后结贴了。。

我直接把 imagepng($image);   改为 imagepng($image,$this->_image_path); 了

其他的都没改

哦,还有注意一点的是,因为你这程序还没有复制移动(即上传)到别的文件夹的功能,所以,你所生成的圆角图片覆盖的是原图片

如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理

哦,还有注意一点的是,因为你这程序还没有复制移动(即上传)到别的文件夹的功能,所以,你所生成的圆角图片覆盖的是原图片
那如果要输出命名文件又得如何写?

哦,还有注意一点的是,因为你这程序还没有复制移动(即上传)到别的文件夹的功能,所以,你所生成的圆角图片覆盖的是原图片
真是无语,坑爹呀!我告诉你,真的按你的方法,改了直接把 imagepng($image);   改为 imagepng($image,$this->_image_path); 是不行的!!!!!!!!
你自己试了吗???????


哦,还有注意一点的是,因为你这程序还没有复制移动(即上传)到别的文件夹的功能,所以,你所生成的圆角图片覆盖的是原图片
真是无语,坑爹呀!我告诉你,真的按你的方法,改了直接把 imagepng($image);   改为 imagepng($image,$this->_image_path); 是不行的!!!!!!!!
你自己试了吗???????
无语,我不试怎么又那2张图片?


处理之前
所用程序

执行结果


处理后的结果:


处理之前
所用程序

执行结果


处理后的结果:


我可以断定,一定是你告诉我的代码有哪里还需要改?
我真的按你说的,把这句改了,是不行的!!!!!
而且改了之后,不但不会生成文件,图片还无法显示出来!你看:

如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理

实在抱歉。。可以了!!!居然是我电脑的问题!!!!!
我换个电脑就行了!!!无语。。。实在为难你了版主!!!

那另外请教一个,如果要将生成的图片输出保存到指定目录,又得如何写才好呢?


如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理

实在抱歉。。可以了!!!居然是我电脑的问题!!!!!
我换个电脑就行了!!!无语。。。实在为难你了版主!!!

那另外请教一个,如果要将生成的图片输出保存到指定目录,又得如何写才好呢?

这个我在20#说过了
“如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理”

如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理
这样不是比较麻烦?
无法说直接 www.xxx.com/pic.php?pic=123.jpg 这样通过文件执行来生成一个文件到指定目录?


如果你想生成到别的文件夹,并且不破坏原来的图片,那你必须先复制移动(即上传)到别的文件夹(你指定的文件夹),然后在用移动后的文件进行上面的圆角处理
这样不是比较麻烦?
无法说直接 www.xxx.com/pic.php?pic=123.jpg 这样通过文件执行来生成一个文件到指定目录?

晕死,当然可以啊

文件复制移动,怎么就不可以呢?

关键是你要写文件复制移动程序

如果你是保存时用的还是原来的图片名称,保存时加个随机数,否则生成的图片保存时还是原来的那张图。

或者保存时换个名称。

关键是你要写文件复制移动程序
我就文件重命名行吧?例如生成的文件保存到指定目录okpic里面,可是。。我今晚试了也不行。。。代码总写不对。。。。
继续求救如何写?


关键是你要写文件复制移动程序
我就文件重命名行吧?例如生成的文件保存到指定目录okpic里面,可是。。我今晚试了也不行。。。代码总写不对。。。。
继续求救如何写?
我想问你,你懂文件复制移动么?

简单的不能再简单

只要在
private function _load_source_image() {  
      这个函数的
        $ext = substr($this->_image_path, strrpos($this->_image_path, '.'));  
        if (empty($ext)) {  
            return false;     
        }  
这段代码下面加一个复制移动文件的代码就OK,即:

if (file_exists($this->_image_path) === TRUE) {			 if(!file_exists('okpic')){				  @mkdir('okpic');			 }			 $newpath='okpic/'.$this->_image_path;			  if (!copy($this->_image_path, $newpath)){				   return false;			  }			  $this->_image_path=$newpath;		 }


这么简单的复制移动而已

Musico
Musico

Musico 是一个AI驱动的软件引擎,可以生成音乐。 它可以对手势、动作、代码或其他声音做出反应。

下载

如果要重命名也简单

就是只要
$newpath='okpic/'.$this->_image_path; 
改成
$newpath='okpic/'.date('YmdHis').$ext;
这样就可以重命名并且复制移动了

二楼说的可以用的啊

如果要重命名也简单

就是只要
$newpath='okpic/'.$this->_image_path; 
改成
$newpath='okpic/'.date('YmdHis').$ext;
这样就可以重命名并且复制移动了
重命名的我自己写好了,就是按日期去命名。
现在有个问题,就是 http://www.xxx.com/pic.php?gopic=uploadfiles/123.jpg
这样的话,加了uploadfiles的路径目录,总是提示图片不存在,但是却会生成了一个文件到okpic里面?
代码哪里出问题呢?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.9万人学习

前端基础进阶-移动Web
前端基础进阶-移动Web

共187课时 | 23.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号