Home > Backend Development > PHP Tutorial > 搞了两天,没弄成,宣布失败,求高手帮忙!!

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

WBOY
Release: 2016-06-23 14:14:04
Original
786 people have browsed it

下面这个代码,是可以直接把图片处理为四个角都为园的。
但是现在产生的图片是没生成文件的,想改为处理的文件可以生成一个在指定目录。。
弄了两天,总是不行。。。求高手帮忙看看。。谢谢!
例如运行网址: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();  ?>
Copy after login


回复讨论(解决方案)

哥们,保存图片请用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;		 }
Copy after login


这么简单的复制移动而已

如果要重命名也简单

就是只要
$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里面?
代码哪里出问题呢?

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template