響應微博小祕書倡議 連夜加急擼出頭像變灰小工具之開發歷程

昨天看到了微博小祕書關於全國性悼念活動倡議,我很是支持這個倡議。 由於修改灰色頭像會有必定技術門檻,因而思考可否開發一個小工具方便你們使用。 考慮到次日就是哀悼日,準備夜間快速開發上線。前端

 

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 元),這個項目技術難度不高,最難的部分實際上是推廣,即如何讓更多的人瞭解到你的做品,這個是個人短板。無論怎麼說,我離正式創業項目也邁進了一步,儘管沒有什麼收入能作出一個有價值的小工具我也很是高興。

 

以爲好有能夠分享給朋友,感謝啦。

相關文章
相關標籤/搜索