昨天看到了微博小祕書關於全國性悼念活動倡議,我很是支持這個倡議。 由於修改灰色頭像會有必定技術門檻,因而思考可否開發一個小工具方便你們使用。 考慮到次日就是哀悼日,準備夜間快速開發上線。前端
0X00 廢話少說先上東西java
有興趣的老哥能夠訪問:http://smartding.top:81/ 或者 http://smartding.top:8080/web
由於暫時沒法備案,因此只能採用帶端口或者純 IP 的方式訪問,有點鬱悶。算法
小工具裏面記錄了項目歷程,有興趣能夠閱讀,後端
0X01 選型框架
由於時間至關有限,技術選型必須選擇較爲成熟的腳手架型框架。ide
基於這樣的原則出發,前端框選用 Element.io,Element.io 優點是支持 CDN 引用,你甚至不須要建立一個 Webpack 項目,提供的組件既有顏值也很是穩定可靠,文檔也十分齊全。後端框架則採用 Springboot,經過簡單引入 Springboot 依賴就能夠輕鬆建立一個 Java web 項目。工具
0X02 核心算法ui
技術選型完成以後,開始考慮核心算法也就是如何把彩色圖片轉爲灰度圖片。我沒有圖片處理經驗,但通過摸索大體瞭解了轉換方法。轉換算法其實就是下面的數學公式:spa
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 元),這個項目技術難度不高,最難的部分實際上是推廣,即如何讓更多的人瞭解到你的做品,這個是個人短板。無論怎麼說,我離正式創業項目也邁進了一步,儘管沒有什麼收入能作出一個有價值的小工具我也很是高興。
以爲好有能夠分享給朋友,感謝啦。