昨天看到了微博小秘书关于全国性悼念活动倡议,我很是支持这个倡议。 由于修改灰色头像会有必定技术门槛,因而思考可否开发一个小工具方便你们使用。 考虑到次日就是哀悼日,准备夜间快速开发上线。html
0X00 废话少说先上东西前端
有兴趣的老哥能够访问:http://smartding.top:81/ 或者 http://smartding.top:8080/ 由于无人使用,因此关停了。该项目 开源地址java
由于暂时没法备案,因此只能采用带端口或者纯 IP 的方式访问,有点郁闷。git
小工具里面记录了项目历程,有兴趣能够阅读,github
0X01 选型web
由于时间至关有限,技术选型必须选择较为成熟的脚手架型框架。算法
基于这样的原则出发,前端框选用 Element.io,Element.io 优点是支持 CDN 引用,你甚至不须要建立一个 Webpack 项目,提供的组件既有颜值也很是稳定可靠,文档也十分齐全。后端框架则采用 Springboot,经过简单引入 Springboot 依赖就能够轻松建立一个 Java web 项目。后端
0X02 核心算法框架
技术选型完成以后,开始考虑核心算法也就是如何把彩色图片转为灰度图片。我没有图片处理经验,但通过摸索大体了解了转换方法。转换算法其实就是下面的数学公式:ide
gray(red, green, blue) = (red + green + blue)/3
主要思路是把求得每一个像素的RGB 三色平均值,如此把三维的颜色空间映射到一维的灰度空间。经过逐一转换图片的每个像素,最终咱们获得一副只包含灰度的图片。
具体实现以下:
int width = img.getWidth(); int height = img.getHeight(); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int p = img.getRGB(j, i); int a = (p >> 24) & 0xff; int r = (p >> 16) & 0xff; int g = (p >> 8) & 0xff; int b = p & 0xff; int avg = (r + g + b)/3; //replace RGB value with avg p = (a << 24) | (avg << 16) | (avg << 8) | avg; img.setRGB(j, i, p); } }
0X03 对抗恶意刷流
第二个难点是如何既保证使用体验又避免恶意刷流量,考虑到应用的生命周期极短,我采用的方法是带宽采用按流量计费,应用中增长单 IP 下载次数限制, Guava 的 Cache 类很好的知足了我需求。
具体实现以下:
// Cache 定义,注意到 expireAfterWrite 很是关键,它用来控制限流周期。 private final LoadingCache<String, AtomicInteger> cache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.DAYS).build(new CacheLoader<String, AtomicInteger>() { @Override public AtomicInteger load(final String s) throws Exception { return new AtomicInteger(0); } }); // 超限检查 String ip = request.getRemoteAddr(); AtomicInteger counter = cache.get(ip); if (counter.getAndIncrement() > 50) { log.error("ip {} try too many time, rejected!", ip); throw new RuntimeException("try too many!"); }
0X04 总结
这是个人一我的做品,甚至我还得到的人生的第一粒金(有慷慨老哥支持了 0.1 元),这个项目技术难度不高,最难的部分实际上是推广,即如何让更多的人了解到你的做品,这个是个人短板。无论怎么说,我离正式创业项目也迈进了一步,尽管没有什么收入能作出一个有价值的小工具我也很是高兴。
以为好有能够分享给朋友,感谢啦。
原文出处:https://www.cnblogs.com/jerry-chin/p/12631590.html