银河下的约书亚树,加利福尼亚州,美国 (© Chao Zhang/Getty Images)

Welcom to 评论 - lizhenqiu blog!

    #2319

    作者:广西南宁市
    新卢德主义(Neo-Luddism)是一种反对多种形式的现代技术的哲学思想,以活跃于1811年到1816年的卢德运动命名。这些团体和一些现代新卢德主义者的共同特点,是捣毁技术设备或弃之不用及提倡简朴的生活。新卢德主义源于技术对个人、团体和环境有负面影响的观点。新卢德主义者也担心未来新技术可能产生的未知影响。现代新卢德主义运动与反全球化运动、无政府原始主义、激进环境主义和深层生态学有关。
    文章:无用阶级之崛起--那些无用的人----《人类简史》读后感  发表时间:2016-08-18, 09:23:52  
    展开↯

    #2320

    作者:北京市
    有一天,张怡宁结婚生子了,她对他的孩子说:“金牌你随便玩,你娘我多的是,但那个银牌你别动,我就那一块”
    文章:我身边有个这样的人  发表时间:2016-08-18, 00:49:30  
    展开↯

    #2321

    作者:广西南宁市
    人民民主素质差,搞专制就有理了??
    文章:我看过一个故事  发表时间:2016-08-17, 16:06:47  
    展开↯

    #2322

    作者:广西南宁市
    妹子说她在家上厕所的时候,发现没有纸了,习惯叫男友的名字,叫完才意识到两个人已经分手了,就忍不住坐在马桶上哭,然后马桶盖轻轻靠下来拍了拍她的背。。。。
    文章:我看过一个故事  发表时间:2016-08-17, 15:39:25  
    展开↯

    #2323

    作者:广西南宁市
    不过好佩服王宝强,一个是经纪人,一个是枕边人,两个于公于私都掌握了他最多秘密的人…竟然这么多天了还没挖出黑点,可见这人平时生活真的是有点老实了…
    文章:我看过一个故事  发表时间:2016-08-17, 15:31:53  
    展开↯

    #2324

    作者:广西南宁市
    派出所抓到一个小偷,警察问:“你偷什么了?”
    小偷说偷了镐、扫帚、簸箕。
    警察直接给小偷一个大嘴巴:“你就不能偷个电视机、电风扇?你就不能偷点我会写的?”
    文章:我看过一个故事  发表时间:2016-08-17, 15:31:07  
    展开↯

    #2325

    作者:广西南宁市
    “老板,这件衣服多少钱?”“15块!”“老板你会不会做生意啊?还让不让别人砍价了!”
    文章:我身边有个这样的人  发表时间:2016-08-17, 15:22:10  
    展开↯

    #2326

    作者:广西南宁市
    自从王宝强披绿以后,局长出差就提高警惕,晚上给他老婆打电话。聊了几句他老婆说:“早点睡吧!今天我太累了………” 局长:“我怎么听屋里还有别人动静呢?” 老婆:“你出差我一个人,有点怕,叫闺蜜雨晴过来陪我,怎么了?还不相信我呀,要不,我叫雨晴跟你说两句!” 局长:“不用了,我相信你,早点睡吧!” 放下电话后, 局长看着身边熟睡的雨晴,抽了一宿的烟,然后就病倒了…………这个故事告诉我们:吸烟有害健康!
    文章:我身边有个这样的人  发表时间:2016-08-17, 15:20:41  
    展开↯

    #2327

    作者:广西南宁市
    难道这届风口不行?
    展开↯

    #2328

    作者:广西南宁市
    这来自于老板对于公关的定位及角色扮演。态度可能借鉴,但实操需要看实际情况
    展开↯

    #2329

    作者:广西南宁市
    一个人的知识不一定要多,但是一定要有很多见识。
    文章:我看过一个故事  发表时间:2016-08-17, 11:32:37  
    展开↯

    #2330

    作者:广西南宁市
    计算机很简单,简单到所有的文件、IO、指令、地址都是101010的序列。
    计算机很复杂,复杂到所有的文件、IO、指令、地址都是101010的序列。
    文章:真好,我也想码一辈子的代码  发表时间:2016-08-16, 17:58:21  
    展开↯

    #2331

    作者:广西南宁市
    其实,我有一个建议,也打算这么实施。定一个职位目标,比如中高级开发工程师、产品经理、项目经理、架构师。然后,梳理这些职位所需要的专业技能,比如后端技能、前端技能、任务安排调度技能。画一个知识体系图,逐步实现一下
    文章:真好,我也想码一辈子的代码  发表时间:2016-08-16, 17:58:03  
    展开↯

    #2332

    作者:广西南宁市
    七年失败的程序之路
    七年,七年,七年。从09年7月毕业至今(2016年7月)整整七年,在我的逻辑里,7年时间足以让一个初出茅庐的应届毕业生,打怪升级为一个高级程序员、高级项目经理(如果创业的恐怕也拉到风投了吧)。这也是我当时的景愿,可现实总是那么的残酷,它告诉我没有什么是理所应当,这七年我走了一条弯的不能再弯的路,各种不如意接踵而至,最终的结果是我成了一个算不上哪门子精通,哪门子熟练的,普通的程序员。我并不抱怨各种客观遭遇,我认为一定是我在一些思维方式、习惯、技巧、方法方面出了问题,才导致落到今天这个境地。古人云,可怜之人,必有可恨之处。
    今天想把七年的经历说一下,一是为自己理清思绪重新上路,二是为各位朋友做一个反面案例,做一个警示,三是看看有没有过来人指点一二。下面入正题。
    第一段,企业建站,在职1.5年。Asp语言估计现在毕业的朋友听都没听说过吧,我当时也不了解。其实我大学的专业是J2SE、J2ME、J2EE,也就是如今大热门JAVA专业。但在当时09年初那会儿刚刚金融危机后,经济萧条外包行业有点萎缩,我在人才市场蹲点一个月,一直就找不到工作(可能跟非重点院校、大专文凭有关吧),家里经济条件不好,这样干耗着也不是事,所以最后有一家做ASP建站的公司要我,虽然不是本专业但是没办法也就从了。那时候市场不景气,所以建站已经很廉价了,最低的时候1200元包建站、包域名、包维护。入职头半年还在从JSP到ASP的切换中,我是想把工作做好的,当时埋头苦干很快也就上手了。但是每天的增删改查做了一年之后,真的有点受不了,感觉太low,太没成就感,关键工资还相当低(有6个点的网站提成,但是一个月也没几个单所以。。。) 所以鼓起勇气写了人生第一张辞职申请。当然也就第一次遇到老板挽留,咱这人坏就坏在脸皮薄心肠软,老板找我谈了两次,于是我同意再干一段时间。其实留下来也是有一些内心想法的,觉得已经1年没碰JAVA了,有点陌生,加上之前找不到工作的心理阴影,所以没怎么敢再往JAVA方向走(当时.Net名声还是更大些吧,工资高一些吧),而做了一年ASP,对ASP的处境也有点了解了,觉得Asp.Net才是发展趋势,所以留下来也是想用时间自学ASP.NET然后再去找一份好些的工作。哦对了,忘了对公司的结构介绍一下,人不多10人不到,2个开发,1个美工,其他就不说了。所以自学真的就只能自学了,拖控件交付了一个网站,很心虚,很怕维护。。。就这样半年后带着半桶水的Asp.Net水平,再一次提出辞职,这次真走了。
    第二段,内部系统开发维护,在职3.5年。半桶水的.Net技术,可想而知得吃多少闭门羹了。我当时自己的分析是,毕竟用ASP开发是没问题了,就是.net差一些需要继续提升,那么对口的企业就应该是含有ASP业务,同时又有.Net需求可以供我后期发展,关键一定要有团队配合,我不想自己闭门造车了。按着这个标准,没多久就让我找到了,这个公司内部旧系统维护用的是ASP,同时新上线的CRM是需要用.Net开发的,内部还有几个开发人员,并有外包团队跟进CRM,我一看一切都符合我的想法,开开心心就接受了。只是后来事情的发展并不如我所预料。在我入职的半年内,旧的开发人员逐步流失,最后竟只剩我一个开发人员及两个硬件工程师。接下来又由于公司与外包公司闹矛盾导致验收久拖不决,不久外包团队也整体撤走了,留下了一个半生不熟的CRM系统。在开过几次会后,公司领导不希望再投入大笔资金去请外包团队了,功能从简只做核心需求,希望我能把CRM盘活起来,也许是太想做出成绩的缘故吧,最后我真的答应了。所以大概有一年半的时间,我就跟这个系统耗上了,我原以为公司后续还会再招人来帮帮我,如果招到高手还能带带我,等呀等呀望穿秋水,结果你懂的,真的是我一个人从头干到尾直到我离职。
    前期参加了无数个会议获取开发需求,当然这些会议不是专门为我开的,因为公司准备转型各个流程都在变。接下来我利用大学学到的有限的软件工程知识进行概要设计,参照百度模板写了好几个很粗糙很稚嫩的文档。其实领导并没有要求写,但是我当时希望自己能做好一点,还想着以后接手我工作的人会顺利些。再接着轮到绞尽脑汁用半桶水的.Net技术进行开发工作,那时候还不知道JQuery这玩意这么好用,我一直用着纯Javascript,后来在参考那个外包团队的代码时发现的JQuery,如获至宝。这个MSCRM是微软的平台,项目其实是在上面做二次开发,功能接口倒是齐全,就是中文资料很少,所以至少有3个月时间是边看它的英文文档边开发的(我觉得我后来看英文文档的功底都是在那建立起来的)。 别以为开发完了就万事大吉了,没那么容易,还得搞项目实施和用户培训,很多销售人员都不愿意把客户信息录入系统、很多大龄销售人员不会用电脑,所以得听着无数人把他们的怒火砸在我身上,咱还得耐心跟他们讲解,有时候晚上很晚了还要电话远程教他们怎么用(他们白天都要跑客户,晚上才会回家录数据)。由于项目不止涉及到销售部门,这是一个财务部、采购部、商务部、销售部、生产部联动的系统,我还得组织各个部门的操作专员开会,判断哪个环节有问题,哪个环节要改进。这里还得念一下老东家的好,领导层对我的工作还是很支持的,都很好的约束了自己的部下,所以各个部门都比较配合我,任我瞎折腾,再多的抱怨也只是抱怨,过后还是会老老实实的在系统录数据。朋友说怎么看都像是项目经理干的事,那时候的我哪里知道项目经理该干嘛,只是项目经理至少有小弟可以指挥吧,我自己就是最小的小弟,没人可供差遣。
    就这样时间一晃三年半过去了,我开始着急了,我的最初设想是来提升.Net技术的,我是来寻找团队,结果团队一直没有,然后各方面的杂事干了一堆,.Net技术只提升一点点。我在最后那段时间很崩溃,两份工作的时间1.5+3.5=5年,天啊,一个毕业5年的技术人员,还是初级程序员。其实本来早该走了,但我当时觉得项目还没有完全收尾,如果我走了,唯一一个知道来龙去脉的人走了,这个项目就Game Over了,不管是公司之前的投入,还是之前自己的努力,都会付诸东流。说得好听点这叫主人翁精神,有责任心,说得不好听的,这就二啊以为世界没了自己就转不下去。这里面还有一个因素,当时公司好多同龄的小年轻,大家玩得很好,所以也是有点不舍。后话是,我离职半年后有老同事说,接手的几个程序员都不愿意干那些累活,慢慢的那个系统就真的废了。
    第三段,CRM系统开发,在职一天。其实算不上一段,也就上了一天班,但是却是烙在我心头永恒的伤疤。半个月前,一个叫某某CRM软件公司(挺出名的行业软件公司)的主管面试我,过程就不说了反正面试时我对自己的描述并不含任何吹牛成分一五一十的说情况,他当时觉得可以,定的半个月后过来上班,offer也正式发了。结果第一天上班,他出了一个题目,说是考察一下代码风格,我其实没太看懂题意,所以也写的不是很好(由于之前的养成的CtrlC+CtrlV的坏习惯,他们公司是盲敲的不让上外网,我肯定没有随身带开发案例嘛,这也算一个因素吧),然后还是那个主管不由分说的把我赶走了。。。我推掉了其他offer来了,却是这样的下场,但是当时又无奈又羞愧,处于崩溃边缘,拿着入职体检默默的走了。后来朋友说他们这涉嫌违约,可以要求补偿的。这天刚好是2014年的愚人节,嗯真巧,大家快乐就好。
    第四段,OA系统开发。这算是一个小小的转折点吧,我终于找到了一家真正的专职的有团队的开发公司。我以为我会呆很久,结果意外总是如影随形。虽然时间很短,仅仅是一年时间,我却成长的很快,从初级程序员升级为中级程序员,毕业5年了终于可以专心的写代码,不用操心杂事。在这段时间里其实很累,晚上有时候加班到一两点,早上6点依然要起来继续干活,为的就是抓紧完成项目收到回款,虽然累但是大家还是激情满满。一年后,公司由于经营不善情况急转直下,出现了很严重的资金链问题,项目团队越来越懒散,已经超过我能承受的范围。这一次我不再拖泥带水,果断的辞职不接受任何往挽留,寻找生命中的下一站。
    第五段,高端商品在线订购系统,在职1年。这也是我现在正在就职的公司,刚刚干满一年。这一年我倒是接触到了不少新框架、新平台,但是却开心不起来。感觉这一年提升不是很明显,虽然项目在不停的变,但是做的东西没什么深度,在可以预见的明年中感觉也不会有太大变化。这让我很焦虑,主要是这么三个焦虑:
    一、新技术焦虑。我们做的是高端商品订购,价格很贵,流量不会很高,所以根本不用去考虑什么高并发访问,分布式这回事,功能做出来逻辑通了,业务通了基本就不会有问题了,相当于说高并发、分布式这一块基本没有实践机会,但是如果我想再往上走,这些就很重要了(我自己认为的)。朋友说既然想搞这些那就去一些大公司,我又何曾不想,只是陷入一个死循环中——没机会提升这些技术,大公司不收;大公司不收,还是没机会提升这些技术。实话说很多时候我都不敢上CSDN,一看首页总是有那么多新框架,新技术出来,看完就感觉这辈子也追不上了,要被遗弃了。开始怀疑还有必要往这个方向走下去吗。
    二、面对肤浅的焦虑。说一个很基础的东西,面向对象开发,对现在的我们来说,只是拿着面向对象的语言,来开发面向过程的功能罢了,底层结构是基本定好的,所有的项目基本不用改,工期在也不允许改,因为重新搞一个底层架构耗时太多,没有必要。所以我们的工作模式也就是“取数据-加工-输出”,这跟设计模式没有半毛钱关系,这样再做一年我还是廉价的代码搬运工。
    三、标准化的开发流程。我其实也不清楚什么是“标准化”,也不知道怎么标准化,但是我觉得一定有一套规则需要对开发过程进行约束,现在虽然我们表面上有一个团队,但是其实说不上什么配合,每个人用着自己的风格写着可读性、复用性很差的代码,文档是个什么东西,没听过。用一句流行的话调侃,程序员最怕两件事,一是要自己写开发文档,二是别人没有写开发文档。(当然这个问题在大大小小的企业存在着,只是程度问题)。我跟项目经理提过要往这方面改进,经理同意了,但是大家都不知道怎么做,而且有些措施很占用时间和精力,推了一段就推不下去了。
    这三个焦虑其实困扰我很久了,一直在想破局的办法,只是一直找不到切入点。我现在还不知道这个会不会引起我的再一次离职,一方面我感觉在当前环境中无法自我破局,所以想换个环境看看会不会好转;另一方面,到了快奔三的年龄换工作的成本有点高,关键用当前实力换来的工作还不一定能解决我上面的问题。
    工作7年的童鞋你们是不是很厉害了,但是我感觉我就只有2年的工龄,差距好大好失败。
    其实,我知道上面的问题很多技术人员或多或少都会遇到,只是这些问题全部出现又刚好跟我的浮躁心理、奔三前一无所成的焦虑搅合在一起,突然间不知道怎么解决。面对这种情况也不知道去问哪谁,好几个夜晚难以入眠。我自己本来是有一个中期目标的——架构师。但是感觉当前的知识量太少,有一种深深的挫败感,啥事也不想做了。所以放荡堕落了一月余,上班迟到、做事不用心、拖拖拉拉。
    有时候这些经历确实也不好意思说出口,真的今天自揭伤口,需要一些勇气,但我感觉只有直面过去,才能走好后面的路。这个月开始放荡够了,还是要找回那个积极向上的我。当然光靠调整状态、励志并不会有太大收效,前面说过我觉得应该是思维方式、习惯、方法上面出了问题,接下来我将会在这些方向去做一些改变。
    就说到这里吧,这是我来博客园的第一篇文章,以后我也会时不时的在上面发布一些半桶水的技术文章,不要见怪,水平这种东西没法作假。我只想逐步的提升。
    欢迎看完来喷,更欢迎有建设性的意见。

    /*************************************/
    /***作者:DisSun原创*********************/
    /***时间:2016.08.06********************/
    /***注释:祭奠逝去的青春,博客园开篇之作******/
    /*************************************/
    文章:真好,我也想码一辈子的代码  发表时间:2016-08-16, 17:56:25  
    展开↯

    #2333

    作者:广西南宁市
    人生不是眼前的苟且,还有诗和远方的田野。
    文章:我身边有个这样的人  发表时间:2016-08-16, 17:47:38  
    展开↯

    #2334

    作者:广西南宁市
    谢谢指点。
    之前听说貌似AppStore在严查动态加载外部代码的行为?所以当初没有采用ulua的解决方案,都是先C#热更新顶住Android版,然后出iOS稳定版 ^ ^
    文章:游戏热更新杂谈  发表时间:2016-08-16, 17:46:50  
    展开↯

    #2335

    作者:广西南宁市
    还有一种办法,就是在U3D上面实现一个IL解释器,类似于mono一样的,这样就可以在iOS上面动态的加载assembly了。
    文章:游戏热更新杂谈  发表时间:2016-08-16, 17:45:18  
    展开↯

    #2336

    作者:广西南宁市
    文章:我看过一个故事  发表时间:2016-08-16, 17:14:45  
    展开↯

    #2337

    作者:广西南宁市
    今天开发公司项目的时候发现thinkphp的水印功能不支持png图片的原始透明,虽然支持png的透明度度处理但是去在图片原本的透明部分填充了白色,真的是令人蛋疼。 于是果断处理,发现thinkphp使用的是imagecopymerge函数,虽然imagecopymerge支持图片的透明处理但是却不保留png的原始透明度。于是果断改为先用imagecopy进行png图片拷贝然后用imagecopymerge,进行处理的方法,效果果然有效。
    修改方法很简单,在image类里面添加一个imagecopymerge_alpha方法,随便找个位置加上下面的代码就可以了。
    static function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ $opacity=$pct; // getting the watermark width $w = imagesx($src_im); // getting the watermark height $h = imagesy($src_im); // creating a cut resource $cut = imagecreatetruecolor($src_w, $src_h); // copying that section of the background to the cut imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); // inverting the opacity //$opacity = 100 - $opacity; // placing the watermark now imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity); }
    Run code
    Cut to clipboard

      第二步用imagecopymerge_alpha替换原来的imagecopymerge处理,大约83行将
      //生成混合图像 imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);
      Run code
      Cut to clipboard

        替换为
        //生成混合图像 self::imagecopymerge_alpha($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);
        Run code
        Cut to clipboard

          ok搞定,如果看不懂,或者觉得自己修改麻烦,那就直接复制下面的代码,替换Image.class.php内的所有代码
          <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2009 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- /** * 图像操作类库 * @category ORG * @package ORG * @subpackage Util * @author liu21st <liu21st@gmail.com> * @Modify shooke QQ82523829 */ class Image { /** * 取得图像信息 * @static * @access public * @param string $image 图像文件名 * @return mixed */ static function getImageInfo($img) { $imageInfo = getimagesize($img); if ($imageInfo !== false) { $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1)); $imageSize = filesize($img); $info = array( "width" => $imageInfo[0], "height" => $imageInfo[1], "type" => $imageType, "size" => $imageSize, "mime" => $imageInfo['mime'] ); return $info; } else { return false; } } /** * 为图片添加水印 * @static public * @param string $source 原文件名 * @param string $water 水印图片 * @param string $$savename 添加水印后的图片名 * @param string $alpha 水印的透明度 * @return void */ static public function water($source, $water, $savename=null, $alpha=80) { //检查文件是否存在 if (!file_exists($source) || !file_exists($water)) return false; //图片信息 $sInfo = self::getImageInfo($source); $wInfo = self::getImageInfo($water); //如果图片小于水印图片,不生成图片 if ($sInfo["width"] < $wInfo["width"] || $sInfo['height'] < $wInfo['height']) return false; //建立图像 $sCreateFun = "imagecreatefrom" . $sInfo['type']; $sImage = $sCreateFun($source); $wCreateFun = "imagecreatefrom" . $wInfo['type']; $wImage = $wCreateFun($water); //设定图像的混色模式 imagealphablending($wImage, true); //图像位置,默认为右下角右对齐 $posY = $sInfo["height"] - $wInfo["height"]; $posX = $sInfo["width"] - $wInfo["width"]; //生成混合图像 self::imagecopymerge_alpha($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha); //输出图像 $ImageFun = 'Image' . $sInfo['type']; //如果没有给出保存文件名,默认为原图像名 if (!$savename) { $savename = $source; @unlink($source); } //保存图像 $ImageFun($sImage, $savename); imagedestroy($sImage); } function showImg($imgFile, $text='', $x='10', $y='10', $alpha='50') { //获取图像文件信息 //2007/6/26 增加图片水印输出,$text为图片的完整路径即可 $info = Image::getImageInfo($imgFile); if ($info !== false) { $createFun = str_replace('/', 'createfrom', $info['mime']); $im = $createFun($imgFile); if ($im) { $ImageFun = str_replace('/', '', $info['mime']); //水印开始 if (!empty($text)) { $tc = imagecolorallocate($im, 0, 0, 0); if (is_file($text) && file_exists($text)) {//判断$text是否是图片路径 // 取得水印信息 $textInfo = Image::getImageInfo($text); $createFun2 = str_replace('/', 'createfrom', $textInfo['mime']); $waterMark = $createFun2($text); //$waterMark=imagecolorallocatealpha($text,255,255,0,50); $imgW = $info["width"]; $imgH = $info["width"] * $textInfo["height"] / $textInfo["width"]; //$y = ($info["height"]-$textInfo["height"])/2; //设置水印的显示位置和透明度支持各种图片格式 imagecopymerge($im, $waterMark, $x, $y, 0, 0, $textInfo['width'], $textInfo['height'], $alpha); } else { imagestring($im, 80, $x, $y, $text, $tc); } //ImageDestroy($tc); } //水印结束 if ($info['type'] == 'png' || $info['type'] == 'gif') { imagealphablending($im, FALSE); //取消默认的混色模式 imagesavealpha($im, TRUE); //设定保存完整的 alpha 通道信息 } Header("Content-type: " . $info['mime']); $ImageFun($im); @ImageDestroy($im); return; } //保存图像 $ImageFun($sImage, $savename); imagedestroy($sImage); //获取或者创建图像文件失败则生成空白PNG图片 $im = imagecreatetruecolor(80, 30); $bgc = imagecolorallocate($im, 255, 255, 255); $tc = imagecolorallocate($im, 0, 0, 0); imagefilledrectangle($im, 0, 0, 150, 30, $bgc); imagestring($im, 4, 5, 5, "no pic", $tc); Image::output($im); return; } } /** * 生成缩略图 * @static * @access public * @param string $image 原图 * @param string $type 图像格式 * @param string $thumbname 缩略图文件名 * @param string $maxWidth 宽度 * @param string $maxHeight 高度 * @param string $position 缩略图保存目录 * @param boolean $interlace 启用隔行扫描 * @return void */ static function thumb($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) { // 获取原图信息 $info = Image::getImageInfo($image); if ($info !== false) { $srcWidth = $info['width']; $srcHeight = $info['height']; $type = empty($type) ? $info['type'] : $type; $type = strtolower($type); $interlace = $interlace ? 1 : 0; unset($info); $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例 if ($scale >= 1) { // 超过原图大小不再缩略 $width = $srcWidth; $height = $srcHeight; } else { // 缩略图尺寸 $width = (int) ($srcWidth * $scale); $height = (int) ($srcHeight * $scale); } // 载入原图 $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type); if(!function_exists($createFun)) { return false; } $srcImg = $createFun($image); //创建缩略图 if ($type != 'gif' && function_exists('imagecreatetruecolor')) $thumbImg = imagecreatetruecolor($width, $height); else $thumbImg = imagecreate($width, $height); //png和gif的透明处理 by luofei614 if('png'==$type){ imagealphablending($thumbImg, false);//取消默认的混色模式(为解决阴影为绿色的问题) imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息(为解决阴影为绿色的问题) }elseif('gif'==$type){ $trnprt_indx = imagecolortransparent($srcImg); if ($trnprt_indx >= 0) { //its transparent $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx); $trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']); imagefill($thumbImg, 0, 0, $trnprt_indx); imagecolortransparent($thumbImg, $trnprt_indx); } } // 复制图片 if (function_exists("ImageCopyResampled")) imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight); else imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight); // 对jpeg图形设置隔行扫描 if ('jpg' == $type || 'jpeg' == $type) imageinterlace($thumbImg, $interlace); // 生成图片 $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type); $imageFun($thumbImg, $thumbname); imagedestroy($thumbImg); imagedestroy($srcImg); return $thumbname; } return false; } /** * 根据给定的字符串生成图像 * @static * @access public * @param string $string 字符串 * @param string $size 图像大小 width,height 或者 array(width,height) * @param string $font 字体信息 fontface,fontsize 或者 array(fontface,fontsize) * @param string $type 图像格式 默认PNG * @param integer $disturb 是否干扰 1 点干扰 2 线干扰 3 复合干扰 0 无干扰 * @param bool $border 是否加边框 array(color) * @return string */ static function buildString($string, $rgb=array(), $filename='', $type='png', $disturb=1, $border=true) { if (is_string($size)) $size = explode(',', $size); $width = $size[0]; $height = $size[1]; if (is_string($font)) $font = explode(',', $font); $fontface = $font[0]; $fontsize = $font[1]; $length = strlen($string); $width = ($length * 9 + 10) > $width ? $length * 9 + 10 : $width; $height = 22; if ($type != 'gif' && function_exists('imagecreatetruecolor')) { $im = @imagecreatetruecolor($width, $height); } else { $im = @imagecreate($width, $height); } if (empty($rgb)) { $color = imagecolorallocate($im, 102, 104, 104); } else { $color = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]); } $backColor = imagecolorallocate($im, 255, 255, 255); //背景色(随机) $borderColor = imagecolorallocate($im, 100, 100, 100); //边框色 $pointColor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //点颜色 @imagefilledrectangle($im, 0, 0, $width - 1, $height - 1, $backColor); @imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor); @imagestring($im, 5, 5, 3, $string, $color); if (!empty($disturb)) { // 添加干扰 if ($disturb = 1 || $disturb = 3) { for ($i = 0; $i < 25; $i++) { imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $pointColor); } } elseif ($disturb = 2 || $disturb = 3) { for ($i = 0; $i < 10; $i++) { imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $pointColor); } } } Image::output($im, $type, $filename); } /** * 生成图像验证码 * @static * @access public * @param string $length 位数 * @param string $mode 类型 * @param string $type 图像格式 * @param string $width 宽度 * @param string $height 高度 * @return string */ static function buildImageVerify($length=4, $mode=1, $type='png', $width=48, $height=22, $verifyName='verify') { import('ORG.Util.String'); $randval = String::randString($length, $mode); session($verifyName, md5($randval)); $width = ($length * 10 + 10) > $width ? $length * 10 + 10 : $width; if ($type != 'gif' && function_exists('imagecreatetruecolor')) { $im = imagecreatetruecolor($width, $height); } else { $im = imagecreate($width, $height); } $r = Array(225, 255, 255, 223); $g = Array(225, 236, 237, 255); $b = Array(225, 236, 166, 125); $key = mt_rand(0, 3); $backColor = imagecolorallocate($im, $r[$key], $g[$key], $b[$key]); //背景色(随机) $borderColor = imagecolorallocate($im, 100, 100, 100); //边框色 imagefilledrectangle($im, 0, 0, $width - 1, $height - 1, $backColor); imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor); $stringColor = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 120), mt_rand(0, 120)); // 干扰 for ($i = 0; $i < 10; $i++) { imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $stringColor); } for ($i = 0; $i < 25; $i++) { imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $stringColor); } for ($i = 0; $i < $length; $i++) { imagestring($im, 5, $i * 10 + 5, mt_rand(1, 8), $randval{$i}, $stringColor); } Image::output($im, $type); } // 中文验证码 static function GBVerify($length=4, $type='png', $width=180, $height=50, $fontface='simhei.ttf', $verifyName='verify') { import('ORG.Util.String'); $code = String::randString($length, 4); $width = ($length * 45) > $width ? $length * 45 : $width; session($verifyName, md5($code)); $im = imagecreatetruecolor($width, $height); $borderColor = imagecolorallocate($im, 100, 100, 100); //边框色 $bkcolor = imagecolorallocate($im, 250, 250, 250); imagefill($im, 0, 0, $bkcolor); @imagerectangle($im, 0, 0, $width - 1, $height - 1, $borderColor); // 干扰 for ($i = 0; $i < 15; $i++) { $fontcolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); imagearc($im, mt_rand(-10, $width), mt_rand(-10, $height), mt_rand(30, 300), mt_rand(20, 200), 55, 44, $fontcolor); } for ($i = 0; $i < 255; $i++) { $fontcolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $fontcolor); } if (!is_file($fontface)) { $fontface = dirname(__FILE__) . "/" . $fontface; } for ($i = 0; $i < $length; $i++) { $fontcolor = imagecolorallocate($im, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); //这样保证随机出来的颜色较深。 $codex = String::msubstr($code, $i, 1); imagettftext($im, mt_rand(16, 20), mt_rand(-60, 60), 40 * $i + 20, mt_rand(30, 35), $fontcolor, $fontface, $codex); } Image::output($im, $type); } /** * 把图像转换成字符显示 * @static * @access public * @param string $image 要显示的图像 * @param string $type 图像类型,默认自动获取 * @return string */ static function showASCIIImg($image, $string='', $type='') { $info = Image::getImageInfo($image); if ($info !== false) { $type = empty($type) ? $info['type'] : $type; unset($info); // 载入原图 $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type); $im = $createFun($image); $dx = imagesx($im); $dy = imagesy($im); $i = 0; $out = '<span style="padding:0px;margin:0;line-height:100%;font-size:1px;">'; set_time_limit(0); for ($y = 0; $y < $dy; $y++) { for ($x = 0; $x < $dx; $x++) { $col = imagecolorat($im, $x, $y); $rgb = imagecolorsforindex($im, $col); $str = empty($string) ? '*' : $string[$i++]; $out .= sprintf('<span style="margin:0px;color:#%02x%02x%02x">' . $str . '</span>', $rgb['red'], $rgb['green'], $rgb['blue']); } $out .= "<br>\n"; } $out .= '</span>'; imagedestroy($im); return $out; } return false; } /** * 生成UPC-A条形码 * @static * @param string $type 图像格式 * @param string $type 图像格式 * @param string $lw 单元宽度 * @param string $hi 条码高度 * @return string */ static function UPCA($code, $type='png', $lw=2, $hi=100) { static $Lencode = array('0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'); static $Rencode = array('1110010', '1100110', '1101100', '1000010', '1011100', '1001110', '1010000', '1000100', '1001000', '1110100'); $ends = '101'; $center = '01010'; /* UPC-A Must be 11 digits, we compute the checksum. */ if (strlen($code) != 11) { die("UPC-A Must be 11 digits."); } /* Compute the EAN-13 Checksum digit */ $ncode = '0' . $code; $even = 0; $odd = 0; for ($x = 0; $x < 12; $x++) { if ($x % 2) { $odd += $ncode[$x]; } else { $even += $ncode[$x]; } } $code.= ( 10 - (($odd * 3 + $even) % 10)) % 10; /* Create the bar encoding using a binary string */ $bars = $ends; $bars.=$Lencode[$code[0]]; for ($x = 1; $x < 6; $x++) { $bars.=$Lencode[$code[$x]]; } $bars.=$center; for ($x = 6; $x < 12; $x++) { $bars.=$Rencode[$code[$x]]; } $bars.=$ends; /* Generate the Barcode Image */ if ($type != 'gif' && function_exists('imagecreatetruecolor')) { $im = imagecreatetruecolor($lw * 95 + 30, $hi + 30); } else { $im = imagecreate($lw * 95 + 30, $hi + 30); } $fg = ImageColorAllocate($im, 0, 0, 0); $bg = ImageColorAllocate($im, 255, 255, 255); ImageFilledRectangle($im, 0, 0, $lw * 95 + 30, $hi + 30, $bg); $shift = 10; for ($x = 0; $x < strlen($bars); $x++) { if (($x < 10) || ($x >= 45 && $x < 50) || ($x >= 85)) { $sh = 10; } else { $sh = 0; } if ($bars[$x] == '1') { $color = $fg; } else { $color = $bg; } ImageFilledRectangle($im, ($x * $lw) + 15, 5, ($x + 1) * $lw + 14, $hi + 5 + $sh, $color); } /* Add the Human Readable Label */ ImageString($im, 4, 5, $hi - 5, $code[0], $fg); for ($x = 0; $x < 5; $x++) { ImageString($im, 5, $lw * (13 + $x * 6) + 15, $hi + 5, $code[$x + 1], $fg); ImageString($im, 5, $lw * (53 + $x * 6) + 15, $hi + 5, $code[$x + 6], $fg); } ImageString($im, 4, $lw * 95 + 17, $hi - 5, $code[11], $fg); /* Output the Header and Content. */ Image::output($im, $type); } static function output($im, $type='png', $filename='') { header("Content-type: image/" . $type); $ImageFun = 'image' . $type; if (empty($filename)) { $ImageFun($im); } else { $ImageFun($im, $filename); } imagedestroy($im); } static function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ $opacity=$pct; // getting the watermark width $w = imagesx($src_im); // getting the watermark height $h = imagesy($src_im); // creating a cut resource $cut = imagecreatetruecolor($src_w, $src_h); // copying that section of the background to the cut imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); // inverting the opacity //$opacity = 100 - $opacity; // placing the watermark now imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity); } }
          Run code
          Cut to clipboard
            文章:解决thinkphp图片上传生成缩略图背景为黑色的问题  发表时间:2016-08-16, 16:53:17  
            展开↯
            你好,残忍屏蔽广告

            确定要清除编辑框内容吗?

            该删除操作将不可恢复。

            删除 取消

            激活Windows

            转到"设置"以激活Windows。