Java實(shí)現(xiàn)圖片的濾鏡效果

濾鏡

濾鏡;主要是用來(lái)實(shí)現(xiàn)圖像的各種特殊效果叛赚。它在Photoshop中具有非常神奇的作用澡绩。濾鏡通常需要同通道圖層等聯(lián)合使用俺附,才能取得最佳藝術(shù)效果肥卡。

在移動(dòng)端或者在web開(kāi)發(fā)時(shí)處理圖片都是一件麻煩的事兒。我調(diào)研過(guò)很多l(xiāng)ibrary事镣,特別是在移動(dòng)端處理圖片時(shí)動(dòng)不動(dòng)都需要使用 C++ 或者 OpenCV步鉴。這對(duì)于 Java 程序員來(lái)說(shuō),具有很高的門檻璃哟。甚至在調(diào)試時(shí)氛琢,遇到錯(cuò)誤都會(huì)無(wú)法下手進(jìn)行處理。其實(shí)随闪,隨著手機(jī)設(shè)備性能的不斷提高阳似,使用 Java 同樣能完成這些事情。

實(shí)現(xiàn)

這是原圖铐伴,可以選擇濾鏡來(lái)美化圖片撮奏。


原圖.png

這是幾種濾鏡的效果


濾鏡效果.jpg

首先,我們的庫(kù)叫 cv4j当宴,cv 是 Computer Vision 的意思畜吊,同時(shí)也用于致敬 OpenCV。
https://github.com/imageprocessor/cv4j

以SepiaTone濾鏡為例户矢,我們自己私下叫它懷舊風(fēng)格的濾鏡

SepiaTone.png
import com.cv4j.core.datamodel.ImageData;
import com.cv4j.image.util.Tools;

public class SepiaToneFilter implements CommonFilter {

    @Override
    public ImageData filter(ImageData src) {
        int width = src.getWidth();
        int height = src.getHeight();

        int offset = 0;
        for(int row=0; row<height; row++) {
            offset = row * width;
            int tr = 0, tg = 0, tb = 0;
            for (int col = 0; col < width; col++) {
                tr = (src.getPixels()[offset] >> 16) & 0xff;
                tg = (src.getPixels()[offset] >> 8) & 0xff;
                tb = src.getPixels()[offset] & 0xff;
                int fr = (int) colorBlend(noise(), (tr * 0.393) + (tg * 0.769) + (tb * 0.189), tr);
                int fg = (int) colorBlend(noise(), (tr * 0.349) + (tg * 0.686) + (tb * 0.168), tg);
                int fb = (int) colorBlend(noise(), (tr * 0.272) + (tg * 0.534) + (tb * 0.131), tb);

                src.getPixels()[offset] = (255 << 24) | (Tools.clamp(fr) << 16) | (Tools.clamp(fg) << 8) | Tools.clamp(fb);
                offset++;
            }
        }
        return src;
    }
    
    private double noise() {
        return Math.random()*0.5 + 0.5;
    }
    
    private double colorBlend(double scale, double dest, double src) {
        return (scale * dest + (1.0 - scale) * src);
    }
}

ImageData是我們自己定義的圖像數(shù)據(jù)結(jié)構(gòu)玲献。所有的濾鏡都是通過(guò)ImageData來(lái)傳遞。

import android.graphics.Bitmap;

public interface ImageData {

    int CV4J_IMAGE_TYPE_RGB = 0;
    int CV4J_IMAGE_TYPE_GRAY = 2;
    int CV4J_IMAGE_TYPE_HSV = 4;
    int CV4J_IMAGE_TYPE_BINARY = 8;

    int[] getPixels();

    int getWidth();

    int getHeight();

    int getType();

    byte[] getChannel(int index);

    void putPixels(int[] pixels);

    int getPixel(int row, int col);

    void setPixel(int row, int col, int rgb);

    int[] getPixelByRowNumber(int rowIndex);

    void convert2Gray();

    Bitmap toBitmap();
}

ImageData是一個(gè)接口,目前它的實(shí)現(xiàn)類只有ColorImage捌年。
所以使用一個(gè)濾鏡瓢娜,通常只要這樣寫的就ok了。

ColorImage colorImage = new ColorImage(bitmap);
CommonFilter filter = new SepiaToneFilter();
colorImage = (ColorImage) filter.filter(colorImage);
imageView.setImageBitmap(colorImage.toBitmap());

性能是我們一直關(guān)心的話題延窜,我在模擬器上跑了demo app恋腕,通過(guò) AOP 的方法打印了 demo app 中一些濾鏡在使用時(shí)花費(fèi)的時(shí)間。


濾鏡花費(fèi)的時(shí)間.jpeg

在demo app中逆瑞,濾鏡實(shí)例化是借助Class.forName()肯定比直接使用new 某個(gè)濾鏡類要慢一些荠藤。


濾鏡實(shí)例化使用Class.forName.jpeg

總結(jié)

cv4j 是賈志剛和我一起開(kāi)發(fā)的圖像處理庫(kù),目前還處于很早期的版本获高。我們每天都會(huì)對(duì)這個(gè)庫(kù)做一些提交哈肖。整個(gè)庫(kù)在架構(gòu)上和圖像算法上都還有很大的提升空間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末念秧,一起剝皮案震驚了整個(gè)濱河市淤井,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摊趾,老刑警劉巖币狠,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砾层,居然都是意外死亡漩绵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肛炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)止吐,“玉大人,你說(shuō)我怎么就攤上這事侨糟“樱” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秕重,是天一觀的道長(zhǎng)不同。 經(jīng)常有香客問(wèn)我,道長(zhǎng)溶耘,這世上最難降的妖魔是什么二拐? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮汰具,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菱魔。我一直安慰自己留荔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著聚蝶,像睡著了一般杰妓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碘勉,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天巷挥,我揣著相機(jī)與錄音,去河邊找鬼验靡。 笑死倍宾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胜嗓。 我是一名探鬼主播高职,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辞州!你這毒婦竟也來(lái)了怔锌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤变过,失蹤者是張志新(化名)和其女友劉穎埃元,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體媚狰,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岛杀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哈雏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楞件。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裳瘪,靈堂內(nèi)的尸體忽然破棺而出土浸,到底是詐尸還是另有隱情,我是刑警寧澤彭羹,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布黄伊,位于F島的核電站,受9級(jí)特大地震影響派殷,放射性物質(zhì)發(fā)生泄漏还最。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一毡惜、第九天 我趴在偏房一處隱蔽的房頂上張望拓轻。 院中可真熱鬧,春花似錦经伙、人聲如沸扶叉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枣氧。三九已至溢十,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間达吞,已是汗流浹背张弛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酪劫,地道東北人吞鸭。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像契耿,于是被迫代替她去往敵國(guó)和親瞒大。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)搪桂、插件透敌、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 揖別鄉(xiāng)關(guān)歲月深, 少年腳印可留痕踢械? 如今白發(fā)飄飄矣酗电, 一夢(mèng)依然在老村。
    高湛明閱讀 522評(píng)論 5 5
  • 前段時(shí)間iOS版The Abandoned限免内列,入手后抱著試一試的心態(tài)進(jìn)如游戲后欲罷不能撵术,在走了很多彎路通關(guān)后果斷...
    geraldx閱讀 261評(píng)論 0 0
  • 我家是住在郊區(qū)的一個(gè)小鎮(zhèn),好像孤立與市區(qū)和其他地方话瞧。小鎮(zhèn)對(duì)外的連接有一條路嫩与,來(lái)往的車流大部分經(jīng)過(guò)這里。 是條看起來(lái)...
    草一由八石石石閱讀 278評(píng)論 2 1