• 欢迎加“百元导航”为主页,windows8风格,0.3s极速加载
  • 王柏元的博客专用搜索引擎:极客人,就用“极客搜”!
  • 极客人

    2015年01月26日注册2017年10月19日最后登录

    记录生活,镌刻心路;泼洒文墨,分享技术!王柏元的博客致力于IT经验交流,并原创翻译引进外文文章,打开IT国际化视野

    Women in IT

     极客人
     2017年08月27日
     71
     0
     0 

    In ThoughtWorks, there are three pillars: continuous business(P1), software excellence(P2), social and economic justice(P3). Taking P3  as a mission of company makes ThoughtWorks unique in all companies.In This week, The founder of ThoughtWorks ,Roy ,has sold ThoughtWorks to APAX, a private equity investment group in Europe, After that the topic about whether P3 will be reserved in the missions of ThoughtWorks is actively discussed among ThoughtWorkers. Social and economic justice is a serious topic in ThoughtWorks. In TWU, this topic will be talked about almost every week.   The social respect for information technology affects women’s information technology, and the work of IT is considered to be very hard and programers work overtime. In China , girls are expected to find a job with little strength. We have done some research to know about the general situation about women in IT.The first problem is gender imbalance.we have found the proportion of women at entry levels in IT are very low, and it tends to worsen as women become more senior. A study shows that In USA, IT jobs held by women is only 25%. The second situation we have found there is common pay gap between men and women.In 2015,women working full time in the united

    我们走过的人生境界

     极客人
     2017年05月11日
     174
     3
     0 

    小时候,我们觉得这个世界天真烂漫,一切都是那么美好,世界就像花园一样,蜂飞蝶舞,阳光明媚; 长大一点,我们读了一些书,见过更多的人,看到更多人生百态,慢慢发现这世界有许多的阴暗面,人怎么能那么坏,那么龌龊,这个国家太黑暗了,社会太无可救药了,我们简直生活在层层阴霾下惶惶终日,随着时间的推移,这阴霾感觉越来越重。 后来,我走过许多路,见过更多的事,经历过人生的许许多多的炎凉,感悟过许多先贤的箴言,理解了许多当初自认为恶人的心境,发现生活一点一滴的感动与温暖,我慢慢发现世界不是我想象的那么黑暗的,芸芸众生里掺杂着多少无奈,有许多人有着不为浅薄的我所不理解的睿智。我当初是片面了吗,不,我相信认识是需要一个过程的。 破茧成蝶,返璞归真,江山如此多娇啊!世界是那么真实,那么辽阔,我解开种种疑惑,冲破心里的种种阴霾,见到久违的阳光,世界越来越光明;人生突然豁然开朗,世界不是蓝天白云,而是如同晚霞下的那种壮美啊! 有一天,你独上高楼望尽天涯路的时候,有人对你说,你还在第一境界啊,幼稚!我希望,你能自信这是别人的浅薄,并用仁慈的胸怀容纳别人的虚妄。

    软件不仅是开发那么简单

     极客人
     2017年03月9日
     415
     6
     0 

    许多“有抱负”或者热爱编程的程序员,对全栈工程师可能都是孜孜以求。全栈是一种极客精神,对软件的每一种编程语言、每一个开发平台都有着浓厚的兴趣,并愿意为之付出努力,全栈工程师应该对软件各个方面都有广泛的接触面,对软件有深刻的洞察力,这种广而深的见识将让我们开发出更加高效率地开发应用。 我们周遭的人对全栈的描述往往是“我熟悉C/C++,java;swift,Ruby都会一点,还能开发IOS、Android、Windows应用,Web前端后端都做过。用过这些框架:……” 全栈元素周期表,来自xebialabs 是的,在没有接触ThoughtWorks之前,我对全栈的定义就是这样的,什么语言都“会”,至少写过,各个平台上的开发都有经验。在这种定义下,我会略自负地讲自己算是一个全栈工程师吧。甚至,哈哈,除了上面讲的这些,我还开发过硬件平台上的软件(Arduino),自己用PS为自己的Android客户端设计过界面、图标,鼓捣过图标字体。是呀,想想这就骄傲,突然发现自己会那么东西。(当然了,理性地讲,其实自己心知肚明也就是“会一点”。) 窃认为我本人是一个对生活比较有想法的人,当我发现生活中有一些可以用软件来解决问题的时候,我喜欢自己开发出软件来解决:比如 我曾因为看到大学请假不方便,然后开发出给学生、辅导员、任课老师使用的请假APP,这个最后作为我Android开发实践课的大作业作品,老师打了100分;由于学校会经常让学生签到,我和几个同学利用微信公众号首先让学生在微信上签到并且获取他们的地理位置;由于在火车上无聊,我和几个同学做出一个在火车上搭建局域网然后借助我们的系统让乘客在火车上点餐、看电影、看火车沿途风景直播、到站提醒的应用……。在这个过程中,我得到很大的满足感和成就感,也学会了更多的软件技术,似乎离“全栈”更近了一步。 产品不仅是有想法就去干,而是持之以恒的打磨,它许多软件开发的多个角色地合力完成 暑假在腾讯实习的两个月,学习到的技术实际上是其次的;甚至因为实习颠覆了之前对BAT神一样存在的看法。他们的代码质量的确很高,但是并不是不食人间烟火,他们也会写Hard code,也会满百度、谷歌地贴代码。实习中让我看到的更多的是,一个好的互联网企业善于让多个角色之间进行良好的互动,它有一个成熟地为开发代码而做的系统;与我们在学校里不同的是,一个来自与产品和测试的需求、Bug工单流传到开发有一个完善严格的流程。 我做过的许多东西,实际很多都没有投入使用,仅仅是自己的自娱自乐,一个软件产品真正投入大规模使用,需要大量人力去做产品、运营。然后,我热爱开发,但是觉得产品、运营是个麻烦事。 入坑越久,你以为越渊博,实际上不自知视野变小了 校招,加入了我一个很喜欢的公司:ThoughtWorks(TW),TW是一个崇尚分享的公司,她期望我们把我们自己的想法用文章的形式表达出来。在周末时间,公司安排了职前培训,其中有一项任务是让我们在简书上写我们的学习过程、分享心得感受。同时公司的培训团队(“思沃大讲堂”)还会定期统计我们的文章,统计方式是做了一个爬虫抓取简书上的文章信息然后汇总输出报告。 当时,我正在学习Ruby网络请求的知识,看见每周一次发来的文章统计报告,我就萌生了做一个Ruby爬虫的想法。做出来以后我输出了一篇文章到简书,负责TW培训的李鹏大哥(下称“总理”)看到以后,便决定让我的代码来做帮助同学们统计文章的工作,之后让我专门成立了一个小团队:思沃大讲堂爬虫项目组 我最初想成立这个项目组的目的,帮我们统计文章只是其一,更重要的是我想通过这个项目带动自己的Ruby学习进程。而总理的目的则是,希望学习项目开发的过程,让更多的人参与、合作。 到今天,几个月过去了,虽然爬虫组虽然基本能定期给参加思沃大讲堂的同学们发送一份统计报告,但是远远没有达到初衷。个人的出发点,本来想把报告做的更漂亮一点,页面中加入一些图片、报表等直观的视觉效果,加入文章排行提高同学们的活跃度,通过简单的算法实现好文章、优秀作者的推荐,找出最贴心的小buddy等等。从这些我想达到的初衷讲,这个项目显然失败了,而失败的原因,也正是总理 想要我们通过这一项目培养的项目开发、交流合作等方面的能力不足。 这个项目中,作为项目发起人,我最早为项目勾画了一个蓝图,搭建起项目的框架。一个在自己看起来很简单的一个需求点,对于自己看来实现起来也十分简单,但是传达给项目成员并实施却十分困难;首先,对于项目发起人,可能会根据自己的一些经验提出一些需求点,虽然这些需求在提出时就经过自己的大脑过滤是可实现的,但是对于没有相关经验的其它团队成员来说,他们认为的可不一定有那么简单。作为作为软件工程科班出身的学生,在我们“稚嫩”的认识中,软件的世界里似乎只有程序员这一个角色,当然“只有”这个词说的太偏执,诚然我还知道产品、测试、运营、运维等角色,但是长期囿于学校里小型项目的学生,往往长期忽略了产品甚至测试的重要性,产品,提需求的是我们;测试,我们写代码的自己测,不重要的地方就省掉吧;运维,随便搭个服务器呗。我们把软件开发的绝大部分重心放在开发上面,做软件就是开发,这一意识的植入,将会导致深重的开发本位思想,或者做事情的都站在开发的角度。比如作为一个项目发起人,我负责这个项目要实现什么样的功能,带着开发思维,是这样提“工单”的: 实现数据库中插入和更新文章信息(封装成一个方法),用于以后在爬虫抓取文章信息后直接调用 甚至我还会写明大家使用Sqlite3数据库。这样的工单开发思维就比较重了,作为项目发起人、作为产品、作为BA(业务分析),这样的单子就严重越权了,我们的职责应该是作为一个角色,要达到什么效果,这样做有什么价值(As a role,I want to …, so that …),具体怎么做应该交给开发,而不是用什么技术都要规划好。当总理指出我的错误,我却依旧带着“开发”的思维来规划项目时,我想我“入坑”依旧了。 或许,对于一个个人项目,我们可能有非常清晰的意图知道自己接下来做什么,然而,做一个较大的项目始终依托团队来完成,作为“世界上最复杂的逻辑实体”,软件是越来越难被一个人完成的。 我所看到“市面”上的“软件工程师”,坦诚地讲,往往等同于“码农”,或者通俗地讲就是“写代码的”。写代码,码农,从“软件工程”的学科定义来讲,并不能算的上是软件工程师的,更谈不上全栈软件工程师。作为一名“科班出身”的“软件工程”专业的学生,教科书上的定义翻译成通俗点的话是这样的:用工程化的方法来开发软件。 而我想,作为工程,应该是怎样规划“施工”,怎样管理团队,怎样让工程更加高效、有序地进行,而这正是软件工程师与“写代码的”之区别本质所在。而全栈,也不仅仅是局限于开发技术上的全栈,而是包括业务分析、项目管理等等软件工程应用上的全栈。   版权印为您的作品印上版权22104666

    React Native中添加Base64支持

     极客人
     2017年03月8日
     498
     0
     0 

    最近极客人在使用React Native制作的自己的博客客户端,客户端在调用Wordpress Rest API时有些操作需要使用HTTP认证,而HTTP认证中主要就是在HTTP请求中的头部加入 “Authorization”字段,Authorization字段的内容时 用户名:密码 的base64编码 环境依赖 Base64编解码算法在Nodejs的buffer组件中有支持,首先我们需要在React Native项目根目录下运行命令行安装buffer依赖: 安装完毕后,React Native根目录的app.json中的dependencies便会自动加入下面一条: React Native中添加Base64支持 使用方式 引入 编码 解码   Buffer项目主页: 更多buffer的使用方法参考Buffer主页:https://github.com/feross/buffer

    Ubuntu下利用Java CV获取双目摄像头图像

     极客人
     2017年03月6日
     240
     0
     0 

    毕业设计的项目是做一个通过双目摄像头测出物体的距离,然后控制模型车避开较近的障碍物,所以需要将安装在模型车上双目摄像头的图像传输,发送到电脑端进行双目测距算法的计算,然后电脑将计算的结果发送到小车,小车控制行驶方向从而避开障碍物。小车上使用Pcduino开发板,安装Ubuntu系统,外插Arduino扩展板,连接小车的硬件部分。 从淘宝上买回的双目摄像头后,使用java cv获取到双目摄像头图像的方式与单目摄像头的方式是类似的。不同的地方是要想分离双目摄像头的画面需要设置代码中的分辨率参数。 如果不对分辨率进行任何的设置,得到的效果是这样的: 双目摄像头画面 是不是似曾相识,我们在电影院看3D电影不戴眼镜看到的就是这样的。对于开发者来说两路图片混合在一起显然不是好事,需要在代码里做如下设置。 因为笔者手中的摄像头每一只分辨率为640480,所以将分辨率改成1280480,可以成功的将图片分离。 图片分离以后的效果是这样的: 双目摄像头图像分离 代码使用了java cv的库,如果是maven项目,需要这样配置依赖: 在pom.xml中project节点下添加: 更多的环境配置可以访问 java cv的官方Github主页。

    怎样释放Android手机存储空间

     极客人
     2017年02月23日
     183
     0
     0 

    Android应用在运行之中会产生一些数据,比如图片的缓存,数据库文件,配置文件等等。我们开发时可能会有这样的一个需求清除应用内缓存的数据,可以让用户选择删除应用内产生的数据,这也是比较人性化的设计点。过多的缓存会占用手机的存储空间,据说也会降低手机的IO性能。 下面这是简书Android APP中提供了清除缓存的设计: 那么Android应用在运行中会产生哪些数据呢?它们都被存放在哪里?然后我们根据产生数据的位置实现清除功能 首先简单讲讲Android的四种数据存储方式 1、SharePreferenc 一种轻型的数据存储方式,实际上是基于XML文件存储的“key-value”键值对数据;通常用来存储程序的一些配置信息。 SharePreference的存储目录: 其存储在“data/data/程序包名/shared_prefs目录下。 SharePreference修改和存储数据 根据Context的getSharedPrerences(key, [模式])方法获取SharedPreference对象; 利用SharedPreference的editor()方法获取Editor对象; 通过Editor的putXXX()方法,将键值对存储数据; 通过Editor的commit()方法将数据提交到SharedPreference内 2、SQLite SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。 Android提供了强大数据库管理库,同时也支持运行哦原生命令,实现数据库的增删改查 3、 File Android中可以在设备本身的存储设备或外接的存储设备中创建用于保存数据的文件。在默认状态下,文件是不能在不同程序间共享的。 File可以通过FileInputStream和FileOutputStream对文件进行操作。 4、ContentProvider ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。它能够实现跨应用之间的数据操作。利用ContentResolver对象的delete、update、insert、query等方法去操ContentProvider的对象,让ContentProvider对象的方法去对数据操作。 实现方式为: 在A程序中定义一个ContentProvider,重载其增删查改等方法; 在A程序中的AndroidManifest.xml中注册ContentProvider; 在B程序中通过ContentResolver和Uri来获取ContentProvider的数据,同样利用Resolver的增删查改方法来获得和处理数据 Android应用的数据存储路径 应用内数据的所有路径和对应的数据清除代码: /data/data/com.xxx.xxx/cache – 应用内缓存(注:对应方法getCacheDir() )   /data/data/com.xxx.xxx/databases – 应用内数据库   /data/data/com.xxx.xxx/shared_prefs – 应用内配置文件   /data/data/com.xxx.xxx/files – 应用内文件(注:对应方法getFilesDir())   由于Android应用数据存储的权限比较宽泛,一个Android应用几乎可以在SD卡任意位置创建一个目录和文件,所以上面的几个存储路径只是Android应用最基本的存储路径。更多的清除代码实现在下面的清除工具类中将于更详细的讲解 清除工具类的代码实现 为了方便使用,下面时我封装好的数据清除工具类:   系统设置应用管理的”清除数据“的实现方法 在Android系统设置的应用管理中,提供了”清除数据“的功能,这一功能对应用数据的清除更加彻底,我们可以在代码中实现类似的需求,不过下面代码的执行将使应用退出:  

    【图片去霾算法实践】NDK下二维数组的传递

     极客人
     2017年01月16日
     250
     1
     0 

    最近看到了一篇关于图片“去霾算法”的文章,一下子就有了兴趣,所以想着能不能实现。由于数学能力捉急,无法理解文章的思想和相关论文。于是在Github上找到了相关的Java代码,算法的效果十分明显: 去霾前的图片 去霾算法处理后的图片 不知道是不是算法太复杂,还是Java效率相对较低的缘故,一个3M的JPG图片处理下来需要近20秒的时间。 效果明显的算法让我萌生了开发一款去霾相机的想法,为了获得更快的处理速度,在研究Java去霾算法代码后,我决定将其写成C++代码,然后通过NDK(Android原生开发)移植到Android平台。 项目的基本思想是在Android/Java下获得图片的Bitmap将其像素点转成二维的int二维数组,然后将int二维数组传入JNI层,交给NDK层C++代码处理,NDK层处理完毕后返回去霾后的int二维数组,由Java层转成Bitmap重新显示或保存。 经过一天的奋斗,我终于实现了用C++代码实现“去霾”算法并顺利移植到Android原生开发中。效果已实现,目前还有很多BUG,图片大小稍大时算法耗费的时间和内存过大. Android 图片去霾 本文预计会写一个系列,后续根据情况可能会开源。如果你对去霾算法实践感兴趣,可以关注我的简书和博客:http://wangbaiyuan.cn ,后续将持续更新 本篇文章介绍NDK和Java层怎样互传二维数组 NDK->C++ ndkArray[mHeight][mWidth]->cppArray[mHeight][mWidth]   C++->NDK cppArray[mHeight][mWidth]->ndkArray[mHeight][mWidth]  

    微信小程序背后的思考

     极客人
     2017年01月11日
     219
     1
     0 

    1月9日,万众期待的微信小程序正式发布;朋友圈早早地被微信小程序的相关信息所刷屏,极客人也耐不住心里的好奇心,也关注了几个微信小程序尝了尝鲜儿。从技术的角度上,微信小程序个人认为谈不上有什么可圈点的创新;但是在软件应用的生态上,可能会产生巨大的影响。 微信公众号 大一统 早在一年多前,那时候还没有人任何微信小程序的风声,极客人在和同学的交流过程中,就曾“预言”了“小程序”的出现。那时候微信公众号只有 订阅号和服务号,我说,微信公众号应该可以加一个“应用号”,一年多以后,微信小程序横空出世,微信公众号也真的多了一个类型 “应用号”,名字和我当初起的都一模一样。当然,我在这里并不是想炫耀自己前瞻眼光,而是想表明,微信小程序的出现是软件开发中一个很正常的产物。 在软件开发繁荣的今天,编程语言越来越多,软件开发的平台不尽相同,软件开发商为了迎合不同使用平台的用户,不得不开发各个平台上的应用,IOS、Android作为移动操作系统的两大巨头,每个都有巨大的用户群,这意味着软件厂商要做一个同样的软件,都要编写两套代码:Android上的JAVA,IOS上的Object C/Swift,这无疑提高了成本。从近几年的软件开发的趋势来看,虽然大家都以标榜自己“全栈开发工程师”为荣,但是我却认为这也只是无奈之举,如果有一套代码在所有平台都能跑的话而且都拥有绝佳的性能的话,没人吃饱着撑着,造出各种开发语言。 软件开发百花齐放的今天,无论是程序员,还是软件厂商,都希望能够有一个“大一统”来结束这个既繁荣又混乱的局面。前几年,HTML5开发移动APP企图基于各平台的浏览器实现跨平台;Web中的前端开发中的“响应式布局”实现一套代码在 PC、平板、手机上智能化显示最适合的界面;QT开发工具希望用一套C++代码开发出在Windows、Linux、Android、IOS的原生APP;最近,React 正在用JS统治Web、IOS、Android的路上越走越远…… 微信小程序要做的,就是开发一套代码,在IOS、Android拥有相同的用户体验,而它基于的是HTML。HTML无疑在各个平台拥有最好的兼容性,哪里有浏览器,哪里就可以解析HTML。 虚拟化 如果让我用一些关键词来概括软件开发的特点的话,在我的答案中一定有一个词就是“虚拟化”。操作系统完成了底层硬件的虚拟化,让上层应用不需要关心底层硬件的操作细节和差异。虽然运行着windows操作系统的计算机数以亿计,它们的CPU、网卡、磁盘等都各不相同,通过Windows系统的Win32 API,程序员和上层应用不必理会底层环境的差异性,程序员运用相同的代码就可以对不同型号的硬件进行操作。同理的还有Java虚拟机。 可以这么说,微信的小程序,就是以微信为平台,通过相同的代码,可以在IOS和Android上拥有相同的操作,比如布局、支付、定位等等,微信虚拟化了布局、支付、定位这一层在Android和IOS上的细节 。在这个意义上,可以说微信是个“操作系统”。当然这样就把操作系统说的太简单,更准确的是微信应该是一个虚拟机。 插件化带来的思考 能预言到“微信小程序”的出现,是不足为奇的,现在许多软件在完成各自职能的同时,往往自身也作为平台出现。 平台是什么?牛顿说,“如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。”。那么这个巨人就是牛顿的平台了。虚拟化带来的结果,就是为上层应用带来更坚实的平台。在平台之上,我们可以忽略平台下面的实现细节。 作为平台出现的软件,可以实现诸多的扩展。极客人的博客是使用wordpress CMS平台搭建的,在wordpress上面,我们可以利用安装插件的方式实现防垃圾评论等等功能;在Chrome浏览器上,我们通过安装插件实现了广告屏蔽;而QQ内置查看word文档的功能,也是通过插件实现的(极客人实习的时候看过QQ的源代码)。 插件是平台之外的扩展,基于平台的插件,忽略了底层细节,同时让平台的功能更加丰富,走得更远。同时,开放的平台,也让平台更加活跃,为自己的生存灌输了青春。 微信小程序在某种意义上也是微信的插件,在极客人尝试了用wordpress、Chrome装插件后,我想,预知“应用号”的出现不会是什么难事。 用完就想卸载 曾经看过一篇文章,每个软件厂商都希望让自己开发的软件在用户的PC、手机上不被卸载,而其中的关键就是占领用户的桌面和状态栏。然而现在的应用市场上的APP千千万,由于过多的APP会导致手机的速度变慢、可用ROM变小,许多用户都是装完一个APP就马上卸载。 由于微信小程序的即用即删性,符合了用户的“洁癖”心理,在一些不常用的应用上,微信小程序必定大受欢迎。 姗姗来迟的谷歌Instant App 在微信小程序发布之前,谷歌在2016年谷歌大会上,曾计划推出一种类似的”小程序”—Android Instant APP;通过谷歌Deep link,用户点击一下链接即可以运行应用,目前仅支持比较简单而基础的应用,可以说它介于纯粹的Web应用和应用程序之间,“Instant Apps”将应用下载大小限制为最高4MB,并向下兼容到安卓4.1操作系统。 我们如今手机安装的应用,占用内存动辄百兆起步,许多应用添加了我们根本不需要的功能,应用间的相互串联也是让我们苦不堪言。如今Instant Apps为我们开启了一扇新的大门,我们手机目前也有点击网页跳转应用的功能,与此不同的是,Instant Apps的跳转直接并非转往完整的应用,而是根据用户的需要,跳转至拥有某个特定功能的APP,比如说我们在网页观看视频,需要转往应用观看,然而该视频应用十分卡顿,经常推送一些无用信息,若该视频应用开发了Instant Apps,那么我们会跳转到该视频的Instant Apps界面,该界面仅包含视频播放的相关功能,十分简洁流畅。 这么一来,若许多购物应用和社交应用都开发了Instant Apps,那么我们的用户体验将会有很大提升,手机的负担也不会那么沉重。从开发者的角度讲,这类应用的推广难度降低,甚至不需提交至应用商店,仅需分享应用的相关连接即可,十分省心。用户点击即用,倒也快捷 基本应用场景和微信小程序类似,个人认为的最大优点可能是原生开发性能会优于微信。但是由于微信小程序拥有微信这个大流量的入口,而且已经先发制人地发布了,我想,Instant APP至少在中国地区胎死腹中。 目测腾讯广告收入不久会出现一个高潮 目前微信小程序里里面还没有广告,但是不久的将来,目测微信很快就会提供财付通的广告SDK方便开发者接入,这么应用转向微信小程序,腾讯的广告收入必定迎来一波大幅度增长。

    Ruby图片处理基本算法(二)二值、灰度、浮雕…

     极客人
     2016年12月30日
     229
     0
     0 

    一、灰度算法 彩色照片每一个像素的颜色值由红、绿、蓝三种值混合而成,红绿蓝的取值分别由很多种,于是像素的颜色值也可以有很多种颜色值,这就是彩色图片的原理,而灰度照片则只有256种颜色,一般的处理方法是将图片颜色值的RGB三个通道值设为一样,这样图片的显示效果就会是灰色。 灰度处理一般有三种算法: 1 最大值法:即新的颜色值R=G=B=Max(R,G,B),这种方法处理后的图片看起来亮度值偏高。 2 平均值法:即新的颜色值R=G=B=(R+G+B)/3,这样处理的图片十分柔和 3 加权平均值法:即新的颜色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由于人眼对不同颜色的敏感度不一样,所以三种颜色值的权重不一样,一般来说绿色最高,红色其次,蓝色最低,最合理的取值分别为Wr = 30%,Wg = 59%,Wb = 11% 下面是加权平均值法的Ruby实现:   灰度效果: out_grey.jpg 二、二值化 图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。 图像二值化常常用于破解验证码等图片识别应用上     二值化效果 out_binary.jpg 三、底片 底片效果的实现很简单,就是将RGB的每一个通道值取反,就是用255去减   底片效果 out_contrary.jpg 四、浮雕效果 浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,因此这样的算法处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,也就是灰色,这样 就具有了浮雕效果。 在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。   浮雕效果 out_emboss.jpg 项目主页 geekeren/RubyImageProcess

    Ruby解析bmp文件及图片处理算法(一)

     极客人
     2016年12月30日
     143
     0
     0 

    一、BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式 下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: bmp文件头(bmp file header):提供文件的格式、大小等信息 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息 调色板(color palette): 可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表 Ø 位图数据(bitmap data):就是图像数据啦^_^ 下面结合Windows结构体的定义,通过一个表来分析这四个部分。 BMP文件数据结构 我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。 BMP文件头数据结构 Paste_Image.png 位图信息头数据结构 位图信息头数据结构 位图数据 每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。 注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。 也即我们见到的第一个像素60是图像最左下角的数据,第二个人像素60为图像最后一行第二列的数据,…一直到最后一行的最后一列数据,后面紧接的是倒数第二行的第一列的数据,依此类推。 如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布: 24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。 32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。 像素的排布规则与前述一致。 对齐规则 讲完了像素的排列规则以及各像素的颜色分量的排列规则,最后我们谈谈数据的对齐规则。我们知道Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高 能表示的了,因为每行可能还需要进行比特填充。 填充后的每行的字节数为: ,其中BPP(Bits Per Pixel)为每像素的比特数。 在程序中,我们可以表示为: int iLineByteCnt = (((m_iImageWidth * m_iBitsPerPixel) + 31) >> 5) << 2; 这样,位图数据区的大小为: m_iImageDataSize = iLineByteCnt * m_iImageHeight; 我们在扫描完一行数据后,也可能接下来的数据并不是下一行的数据,可能需要跳过一段填充数据: skip = 4 – ((m_iImageWidth * m_iBitsPerPixel)>>3) & 3; 二、Ruby实现BMP图片的解析 根据上面的BMP图片格式的介绍,我可以写出以下Ruby代码。   file对象中的read(length)是从文件指针开始读出length个字节的数据,数据类型是字符串,通过unpack函数,我们可以通过传入unpack参数解析出bmp图片的数据结构。 以为例,根据上面的BMP文件数据结构的分析,read(14)是读出bmp文件的前14个字节的文件头,参数’a2LS2L’可以将14个字节的数据解析为 两个字符(1*2字节)、一个Long型(1*8字节)、两个Short型(2*2字节),分别取出bmp图片的文件类型(“BM”)、文件大小、两个保留字段、 图像数据偏移量(@imageDataSize) 。 Paste_Image.png 再从文件中读入@imageDataSize个字节的数据,解析为字符数组,里面除了一些因对齐规则以外的数据都是图片的数据;   如果是24位BMP图片,那么每个像素占据三个字节,分别为RGB中的B、G、R值。 以一个height=2,width=2的图片为例,其图片数据部分转成单字节数组如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 124 254 258 123 212 21 221 56 107 204 251 100 52 100 111 59 其中每一行的无效数据:skipByteALine = 4 – ((2 * 24)>>3) & 3=2 为了更形象地表示图片像素与RGB数据的对应关系,在此我以二维矩阵的方式展示上面的一维数组: Paste_Image.png 由于对齐原则,第一行的7 、8,第二行的15、16元素将被丢弃。 基于以上考虑,可以通过以下Ruby代码获取指定像素位置的RGB值   通过以下Ruby代码设置指定像素位置的RGB值   三、Ruby处理图片 通过上面介绍的setRGB和getRGB方法来修改bmp的图片数据字节数组,我们就可以对bmp的指定像素进行操作了,下面介绍将图片灰度化:   上面的代码我取得所有像素的RGB,然后求出R、G、B值的平均值,RGB值三值相同时像素呈现为灰色 上面的操作只会修改图像数据字节数组,修改完毕需要保存到磁盘,保存方法如下:   原图: raw.jpg 处理效果: out_grey.jpg 下篇文章我将介绍二值化、浮雕滤镜、底片滤镜等图像处理算法 预览: Paste_Image.png 项目主页 geekeren/RubyImageProcess   参考文章 http://blog.csdn.net/hzqnju/article/details/5927825 http://www.jianshu.com/p/30fbaab6d0a6 http://blog.csdn.net/hxker/article/details/50013303 http://blog.csdn.net/o_sun_o/article/details/8351037

    登录

    忘记密码 ?

    您也可以使用第三方帐号快捷登录

    切换登录

    注册