1. 程式人生 > >Android使用GPUImage實現濾鏡效果精煉詳解(一)

Android使用GPUImage實現濾鏡效果精煉詳解(一)

一、前期基礎知識詳解

“濾鏡通常用於相機鏡頭作為調色、新增效果之用。如UV鏡、偏振鏡、星光鏡、各種色彩濾光片。濾鏡也是繪圖軟體中用於製造特殊效果的工具統稱,以Photoshop為例,它擁有風格化、畫筆描邊、模糊、扭曲、銳化、視訊、素描、紋理、畫素化、渲染、藝術效果、其他等12個濾鏡。

濾鏡也可以製作或下載。濾鏡直接使用效果很不自然,要合理搭配才能得到好的效果。”

以上是維基百科中對於濾鏡的定義,而在Android中濾鏡,和Photoshop中一樣,而且通過各種演算法的呼叫,可以更加豐富的效果。Android應用中的相機應用和各種美顏修圖軟體更是將濾鏡用到了極致。

濾鏡處理的物件,通常分為兩類:①靜態圖片;②實時相機預覽

本文先分析第一種濾鏡的使用——為靜態圖片新增濾鏡效果。實現方式有多種,比如通過呼叫Android系統提供的影象處理API,可以設定圖片的色調、飽和度、亮度,也可以呼叫ColorMatrix進行更加精確的圖片色彩調控,還可以使用更加精細化的畫素處理方式—提取圖片畫素點,然後對每個畫素點進行處理,使圖片變換不同的色彩效果,以上的方式都是呼叫Android系統提供的API進行處理,難點在於影象處理演算法的研究,這也是專業影象處理人員的工作之一,嘗試不同色彩矩陣的配合,可以創建出不同的色彩效果。

本文介紹另一種實現方式,使用GPUImage庫進行各種濾鏡效果實現,GPUImage是iOS的一個開源庫,後來也有了Android的版本,可以實現五十多種的濾鏡效果,不用開發者自己進行濾鏡演算法的實現,處理起來更加的方便,而且GPUImage可以做到的不僅僅是像ColorMatrix一樣的色彩特效,還可以進一步實現美顏相機需要的其他特效,比如磨皮,美白等,功能會更加強大。

二、上程式碼,具體實現

build.gradle檔案中新增依賴;

compile'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'

GPUImage API呼叫示例-黑白濾鏡實現

1)建立佈局檔案,建立一個ImageView用於承載圖片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />
</LinearLayout> 

2)Activity程式碼中呼叫API處理

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private ImageView imageView;
    private GPUImage gpuImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.image);
        //獲得Assert資原始檔,放入到Bitmap中
        AssetManager asm = getAssets();
        InputStream isp =null;
        Bitmap bitmap = null;
        try {
            isp = asm.open("android30.jpg");
            bitmap = BitmapFactory.decodeStream(isp);
            isp.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
	//也可以直接從Drawable中通過Bitmap的獲取方式直接獲取
	//bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.android26);
		
        /**核心程式碼:使用GPUImage處理影象
        *setImage():Sets the image on which the filter should be applied.
        *setFilter():Sets the filter which should be applied to the image.
        *getBitmapWithFilterApplied():Gets the current displayed image with applied filter as a Bitmap.
	*/
        gpuImage = new GPUImage(this);
        gpuImage.setImage(bitmap);
	//設定灰度的濾鏡
        gpuImage.setFilter(new GPUImageGrayscaleFilter());
        bitmap = gpuImage.getBitmapWithFilterApplied();
        //顯示處理後的圖片
        imageView.setImageBitmap(bitmap);
    }
}

可以看到,設定黑白濾鏡的步驟非常簡單,呼叫GPUImage中的幾個關鍵方法即可實現:

setImage():Sets the image onwhich the filter should be applied.裡面傳入的引數是bitmap,這個bitmap可以呼叫Bitmap常用的四種載入方式來獲得;

setFilter():Sets the filter whichshould be applied to the image.裡面傳入的引數是一個具體的濾鏡物件,想要實現什麼樣的效果,就傳入什麼的濾鏡例項即可;

getBitmapWithFilterApplied():Getsthe current displayed image with applied filter as a Bitmap.最後呼叫該方法,將建立好的濾鏡設定到bitmap物件中;

最後,只要把設定好濾鏡的bitmap傳給ImageView進行顯示即可,整個過程結束。

原圖:

執行效果如圖:

 

三、GPUImage靈活一點的使用方式

(1)建立一個SeekBar,實現隨著進度條變化,影象飽和度濾鏡變化,實現的濾鏡例項是new GPUImageSaturationFilter(), 程式碼如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private ImageView imageView;
    private GPUImage gpuImage;
    private SeekBar seekbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.image);
        seekbar = (SeekBar) findViewById(R.id.seekbar);
        seekbar.setMax(12);
        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
				//方法的呼叫,這裡用到了回撥的思想:我丟一個Progress給你,你處理後返還一個bitmap給我
                imageView.setImageBitmap(getGPUImageWithBar(progress));
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        //初始化圖片
        imageView.setImageBitmap(getGPUImageFromAssets(0));
    }
	//方法的定義,定義一個有引數,有返回值的方法,引數接收SeekBar傳過來的progress,返回值為bitmap
    public Bitmap getGPUImageWithBar(int progress) {
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.android26);

        gpuImage = new GPUImage(this);
        gpuImage.setImage(bitmap);
		//設定飽和度的濾鏡
        gpuImage.setFilter(new GPUImageSaturationFilter(progress));
        bitmap = gpuImage.getBitmapWithFilterApplied();
        return bitmap;
    }
}

這裡我們建立了一個getGPUImageWithBar()方法,裡面傳入int progress引數,然後在SeekBar的監聽事件中呼叫這個方法,傳入progress引數,然後方法返回一個bitmap,傳給setImageBitmap()作為引數。這裡用到了回撥思想。

執行效果如圖:

(2)封裝一個工具類,把濾鏡實現的程式碼封裝

//Activity程式碼部分
public class MainActivity extends AppCompatActivity {
	......
    private GPUImageUtil gpuImageUtil;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
		......
        context = getApplicationContext();
        gpuImageUtil = new GPUImageUtil();
        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                imageView.setImageBitmap(gpuImageUtil.getGpuImage(context,bitmap,progress));
                Log.d(TAG, "onProgressChanged: ");
            }
		......
        });
        //初始化圖片
        imageView.setImageBitmap(gpuImageUtil.getGpuImage(context,bitmap, 0));
    }
}
// GPUImage工具類部分
public class GPUImageUtil  {
    private static final String TAG = "GPUImageUtil";
    private GPUImage gpuImage;
	//把圖片載入和圖片濾鏡處理放在同一個方法中完成,供外界進行呼叫
    public Bitmap getGpuImage(Context context,Bitmap bitmap, int progress) {
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.android26);

        gpuImage = new GPUImage(context);
        gpuImage.setImage(bitmap);
        gpuImage.setFilter(new GPUImageSaturationFilter(progress));
        bitmap = gpuImage.getBitmapWithFilterApplied();
        Log.d(TAG, "getGpuImage: "+progress);
        return bitmap;
    }
}

GPUImage工具類中的方法和(1)中類似,執行效果如圖:

(3)請求網路圖片,然後對圖片設定濾鏡效果

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private GPUImageUtil gpuImageUtil;
    private Bitmap bitmap;
    private ImageView imageView;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();
        imageView = (ImageView) findViewById(R.id.image);
        gpuImageUtil = new GPUImageUtil();

        //開啟非同步執行緒載入圖片並處理
        MyAsyncTask asynTask = new MyAsyncTask();
        asynTask.execute();
    }

    //建立內部類,繼承自抽象類AsyncTask,指定三個泛型引數,第三個引數為返回值型別
    class MyAsyncTask extends AsyncTask<Integer, Integer, Bitmap> {

        //doInBackground()中處理耗時操作,返回值型別定為Bitmap
        @Override
        protected Bitmap doInBackground(Integer... params) {
            Bitmap bitmap = getGPUImageFromURL("http://himg2.huanqiu.com/attachment2010/2012/0808/20120808100424609.jpg");
            return bitmap;
        }

        //onPostExecute()中處理UI操作,接收的引數來自doInBackground()方法中返回的
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            gpuImageUtil.getGpuImage(context, bitmap);
            imageView.setImageBitmap(bitmap);
        }
    }

    //通過HttpURLConnection獲取網路圖片
    private Bitmap getGPUImageFromURL(String url) {
        try {
            URL imageUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection();

            // 獲得影象的字元流
            InputStream ips = connection.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(ips);
            bitmap = BitmapFactory.decodeStream(bis);
            bis.close();
            ips.close();// 關閉流
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}

1)網路請求是一個耗時操作,需要開啟支執行緒;

2)網路請求之後得到的圖片會在介面中展示,涉及到UI介面的變化,需在主執行緒中進行介面操作;

所以,我們這裡使用AsyncTask進行非同步執行緒的處理,重寫兩個關鍵方法:doInBackground()中處理耗時操作,返回值型別定為Bitmap;onPostExecute()中進行UI操作,接收的引數來自doInBackground()方法中返回的bitmap,然後呼叫GPUImage工具類的中的方法進行濾鏡設定。

3)這裡使用HTTPURLConnection進行網路圖片的請求;

4)記得不要忘記新增網路請求許可權!

(4)封裝一個較為完整的GPUImage工具類,外界呼叫時,只需傳入圖片資源和濾鏡型別,便可對圖片進行相應的處理,程式碼如下:

public class GPUImageUtil {   
    private static GPUImageFilter filter;  
         
    /** 
     * 獲取過濾器 
     * @param GPUFlag 
     * @return 濾鏡型別 
     */  
    public static GPUImageFilter getFilter(int GPUFlag){  
        switch (GPUFlag){  
            case 1:  
                filter = new GPUImageGrayscaleFilter();  
                break;  
            case 2:  
                filter = new GPUImageAddBlendFilter();  
                break;  
            case 3:  
                filter = new GPUImageAlphaBlendFilter();  
                break;  
            case 4:  
                filter = new GPUImageBilateralFilter();  
                break;  
            case 5:  
                filter = new GPUImageBoxBlurFilter();  
                break;  
            case 6:  
                filter = new GPUImageBrightnessFilter();  
                break;  
            case 7:  
                filter = new GPUImageBulgeDistortionFilter();  
                break;  
            case 8:  
                filter = new GPUImageCGAColorspaceFilter();  
                break;  
            case 9:  
                filter = new GPUImageChromaKeyBlendFilter();  
                break;  
            case 10:  
                filter = new GPUImageColorBalanceFilter();  
                break;  
        case 11:  
                filter = new GPUImageSaturationFilter(count);  
                break;                  
        }  
        return filter;  
    }  
  
    public static Bitmap getGpuImage(Context context,GPUImage gpuImage,int FilterFlag){  
        AssetManager as = context.getAssets();  
        InputStream is = null;  
        Bitmap bitmap = null;  
        try {  
            is = as.open("link.jpg");  
            bitmap = BitmapFactory.decodeStream(is);  
            is.close();  
        } catch (IOException e) {  
            Log.e("GPUImage", "Error");  
        }  
  
        // 使用GPUImage處理影象  
        gpuImage = new GPUImage(context);  
        gpuImage.setImage(bitmap);  
        gpuImage.setFilter(getFilter(FilterFlag));  
        bitmap = gpuImage.getBitmapWithFilterApplied();  
        return bitmap;  
    }  
  
    public static Bitmap getGPUImageFromURL(String url) {  
        Bitmap bitmap = null;  
        try {  
            URL imageUrl = new URL(url);  
            HttpURLConnection connection = (HttpURLConnection) imageUrl.openConnection(); 
            // 獲得影象的字元流  
            InputStream is = conn.getInputStream();  
            BufferedInputStream bis = new BufferedInputStream(is);  
            bitmap = BitmapFactory.decodeStream(bis);  
            bis.close();  
            is.close();// 關閉流  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        return bitmap;  
    }  
}

總結:本文主要是使用了GPUImage實現了圖片色彩特效的變換,這也是濾鏡效果的一種,可以看見使用GPUImage對於靜態圖片的處理還是比較簡單的,只要拿到Bitmap物件,然後對這個bitmap物件設定好濾鏡效果即可。

最後附上iOS中GPUImage的濾鏡效果彙總,便於之後查閱(iOS的濾鏡效果更多一些,Android沒有這麼多):

1)Coloradjustments: 31 filters, 顏色處理相關

2)Image processing: 40 filters, 影象處理相關.

3)Blending modes: 29 filters, 混合模式相關.

4)Visual effects: 25 filters, 視覺效果相關.

#import "GPUImageBrightnessFilter.h"                //亮度
#import "GPUImageExposureFilter.h"                  //曝光
#import "GPUImageContrastFilter.h"                  //對比度
#import "GPUImageSaturationFilter.h"                //飽和度
#import "GPUImageGammaFilter.h"                     //伽馬線
#import "GPUImageColorInvertFilter.h"               //反色
#import "GPUImageSepiaFilter.h"                     //褐色(懷舊)
#import "GPUImageLevelsFilter.h"                    //色階
#import "GPUImageGrayscaleFilter.h"                 //灰度
#import "GPUImageHistogramFilter.h"                 //色彩直方圖,顯示在圖片上
#import "GPUImageHistogramGenerator.h"              //色彩直方圖
#import "GPUImageRGBFilter.h"                       //RGB
#import "GPUImageToneCurveFilter.h"                 //色調曲線
#import "GPUImageMonochromeFilter.h"                //單色
#import "GPUImageOpacityFilter.h"                   //不透明度
#import "GPUImageHighlightShadowFilter.h"           //提亮陰影
#import "GPUImageFalseColorFilter.h"                //色彩替換(替換亮部和暗部色彩)
#import "GPUImageHueFilter.h"                       //色度
#import "GPUImageChromaKeyFilter.h"                 //色度鍵
#import "GPUImageWhiteBalanceFilter.h"              //白平橫
#import "GPUImageAverageColor.h"                    //畫素平均色值
#import "GPUImageSolidColorGenerator.h"             //純色
#import "GPUImageLuminosity.h"                      //亮度平均
#import "GPUImageAverageLuminanceThresholdFilter.h" //畫素色值亮度平均,影象黑白(有類似漫畫效果)
#import "GPUImageLookupFilter.h"                    //lookup 色彩調整
#import "GPUImageAmatorkaFilter.h"                  //Amatorka lookup
#import "GPUImageMissEtikateFilter.h"               //MissEtikate lookup
#import "GPUImageSoftEleganceFilter.h"              //SoftElegance lookup
#pragma mark - 影象處理 Handle Image
#import "GPUImageCrosshairGenerator.h"              //十字
#import "GPUImageLineGenerator.h"                   //線條
#import "GPUImageTransformFilter.h"                 //形狀變化
#import "GPUImageCropFilter.h"                      //剪裁
#import "GPUImageSharpenFilter.h"                   //銳化
#import "GPUImageUnsharpMaskFilter.h"               //反遮罩銳化
//#import "GPUImageFastBlurFilter.h"                  //模糊
#import "GPUImageGaussianBlurFilter.h"              //高斯模糊
#import "GPUImageGaussianSelectiveBlurFilter.h"     //高斯模糊,選擇部分清晰
#import "GPUImageBoxBlurFilter.h"                   //盒狀模糊
#import "GPUImageTiltShiftFilter.h"                 //條紋模糊,中間清晰,上下兩端模糊
#import "GPUImageMedianFilter.h"                    //中間值,有種稍微模糊邊緣的效果
#import "GPUImageBilateralFilter.h"                 //雙邊模糊
#import "GPUImageErosionFilter.h"                   //侵蝕邊緣模糊,變黑白
#import "GPUImageRGBErosionFilter.h"                //RGB侵蝕邊緣模糊,有色彩
#import "GPUImageDilationFilter.h"                  //擴充套件邊緣模糊,變黑白
#import "GPUImageRGBDilationFilter.h"               //RGB擴充套件邊緣模糊,有色彩
#import "GPUImageOpeningFilter.h"                   //黑白色調模糊
#import "GPUImageRGBOpeningFilter.h"                //彩色模糊
#import "GPUImageClosingFilter.h"                   //黑白色調模糊,暗色會被提亮
#import "GPUImageRGBClosingFilter.h"                //彩色模糊,暗色會被提亮
#import "GPUImageLanczosResamplingFilter.h"         //Lanczos重取樣,模糊效果
#import "GPUImageNonMaximumSuppressionFilter.h"     //非最大抑制,只顯示亮度最高的畫素,其他為黑
#import "GPUImageThresholdedNonMaximumSuppressionFilter.h" //與上相比,畫素丟失更多
#import "GPUImageSobelEdgeDetectionFilter.h"        //Sobel邊緣檢測演算法(白邊,黑內容,有點漫畫的反色效果)
#import "GPUImageCannyEdgeDetectionFilter.h"        //Canny邊緣檢測演算法(比上更強烈的黑白對比度)
#import "GPUImageThresholdEdgeDetectionFilter.h"    //閾值邊緣檢測(效果與上差別不大)
#import "GPUImagePrewittEdgeDetectionFilter.h"      //普瑞維特(Prewitt)邊緣檢測(效果與Sobel差不多,貌似更平滑)
#import "GPUImageXYDerivativeFilter.h"              //XYDerivative邊緣檢測,畫面以藍色為主,綠色為邊緣,帶彩色
#import "GPUImageHarrisCornerDetectionFilter.h"     //Harris角點檢測,會有綠色小十字顯示在圖片角點處
#import "GPUImageNobleCornerDetectionFilter.h"      //Noble角點檢測,檢測點更多
#import "GPUImageShiTomasiFeatureDetectionFilter.h" //ShiTomasi角點檢測,與上差別不大
#import "GPUImageMotionDetector.h"                  //動作檢測
#import "GPUImageHoughTransformLineDetector.h"      //線條檢測
#import "GPUImageParallelCoordinateLineTransformFilter.h" //平行線檢測
#import "GPUImageLocalBinaryPatternFilter.h"        //影象黑白化,並有大量噪點
#import "GPUImageLowPassFilter.h"                   //用於影象加亮
#import "GPUImageHighPassFilter.h"                  //影象低於某值時顯示為黑



#pragma mark - 視覺效果 Visual Effect
#import "GPUImageSketchFilter.h"                    //素描
#import "GPUImageThresholdSketchFilter.h"           //閥值素描,形成有噪點的素描
#import "GPUImageToonFilter.h"                      //卡通效果(黑色粗線描邊)
#import "GPUImageSmoothToonFilter.h"                //相比上面的效果更細膩,上面是粗曠的畫風
#import "GPUImageKuwaharaFilter.h"                  //桑原(Kuwahara)濾波,水粉畫的模糊效果;處理時間比較長,慎用
#import "GPUImageMosaicFilter.h"                    //黑白馬賽克
#import "GPUImagePixellateFilter.h"                 //畫素化
#import "GPUImagePolarPixellateFilter.h"            //同心圓畫素化
#import "GPUImageCrosshatchFilter.h"                //交叉線陰影,形成黑白網狀畫面
#import "GPUImageColorPackingFilter.h"              //色彩丟失,模糊(類似監控攝像效果)

#import "GPUImageVignetteFilter.h"                  //暈影,形成黑色圓形邊緣,突出中間影象的效果
#import "GPUImageSwirlFilter.h"                     //漩渦,中間形成捲曲的畫面
#import "GPUImageBulgeDistortionFilter.h"           //凸起失真,魚眼效果
#import "GPUImagePinchDistortionFilter.h"           //收縮失真,凹面鏡
#import "GPUImageStretchDistortionFilter.h"         //伸展失真,哈哈鏡
#import "GPUImageGlassSphereFilter.h"               //水晶球效果
#import "GPUImageSphereRefractionFilter.h"          //球形折射,圖形倒立

#import "GPUImagePosterizeFilter.h"                 //色調分離,形成噪點效果
#import "GPUImageCGAColorspaceFilter.h"             //CGA色彩濾鏡,形成黑、淺藍、紫色塊的畫面
#import "GPUImagePerlinNoiseFilter.h"               //柏林噪點,花邊噪點
#import "GPUImage3x3ConvolutionFilter.h"            //3x3卷積,高亮大色塊變黑,加亮邊緣、線條等
#import "GPUImageEmbossFilter.h"                    //浮雕效果,帶有點3d的感覺
#import "GPUImagePolkaDotFilter.h"                  //畫素圓點花樣
#import "GPUImageHalftoneFilter.h"                  //點染,影象黑白化,由黑點構成原圖的大致圖形

#pragma mark - 混合模式 Blend

#import "GPUImageMultiplyBlendFilter.h"             //通常用於建立陰影和深度效果
#import "GPUImageNormalBlendFilter.h"               //正常
#import "GPUImageAlphaBlendFilter.h"                //透明混合,通常用於在背景上應用前景的透明度
#import "GPUImageDissolveBlendFilter.h"             //溶解
#import "GPUImageOverlayBlendFilter.h"              //疊加,通常用於建立陰影效果
#import "GPUImageDarkenBlendFilter.h"               //加深混合,通常用於重疊型別
#import "GPUImageLightenBlendFilter.h"              //減淡混合,通常用於重疊型別
#import "GPUImageSourceOverBlendFilter.h"           //源混合
#import "GPUImageColorBurnBlendFilter.h"            //色彩加深混合
#import "GPUImageColorDodgeBlendFilter.h"           //色彩減淡混合
#import "GPUImageScreenBlendFilter.h"               //螢幕包裹,通常用於建立亮點和鏡頭眩光
#import "GPUImageExclusionBlendFilter.h"            //排除混合
#import "GPUImageDifferenceBlendFilter.h"           //差異混合,通常用於建立更多變動的顏色
#import "GPUImageSubtractBlendFilter.h"             //差值混合,通常用於建立兩個影象之間的動畫變暗模糊效果
#import "GPUImageHardLightBlendFilter.h"            //強光混合,通常用於建立陰影效果
#import "GPUImageSoftLightBlendFilter.h"            //柔光混合
#import "GPUImageChromaKeyBlendFilter.h"            //色度鍵混合
#import "GPUImageMaskFilter.h"                      //遮罩混合
#import "GPUImageHazeFilter.h"                      //朦朧加暗
#import "GPUImageLuminanceThresholdFilter.h"        //亮度閾
#import "GPUImageAdaptiveThresholdFilter.h"         //自適應閾值
#import "GPUImageAddBlendFilter.h"                  //通常用於建立兩個影象之間的動畫變亮模糊效果
#import "GPUImageDivideBlendFilter.h"               //通常用於建立兩個影象之間的動畫變暗模糊效果

參考文章(重點):

相關推薦

Android使用GPUImage實現效果精煉

一、前期基礎知識詳解 “濾鏡通常用於相機鏡頭作為調色、新增效果之用。如UV鏡、偏振鏡、星光鏡、各種色彩濾光片。濾鏡也是繪圖軟體中用於製造特殊效果的工具統稱,以Photoshop為例,它擁有風格化、畫筆描邊、模糊、扭曲、銳化、視訊、素描、紋理、畫素化、渲染、藝術效果、其他

安卓專案實戰之強大的網路請求框架okGo使用實現get,post基本網路請求,下載上傳進度監聽以及對Callback自定義的深入理解

1.新增依賴 //必須使用 compile 'com.lzy.net:okgo:3.0.4' //以下三個選擇新增,okrx和okrx2不能同時使用,一般選擇新增最新的rx2支援即可 compile 'com.lzy.net:okrx:1.0.2' compile 'com.lzy

C程式設計|用函式實現模組化程式設計

目錄 一、為什麼要用函式 使用函式可使程式清晰、精煉、簡單、靈活。 函式就是功能。每一個函式用來實現一個特定的功能。函式名應反映其代表的功能。 在設計

UE4移動元件——移動框架與實現原理

前言 關於UE4的移動元件,我寫了一篇非常詳細的分析文件。由於篇幅比較大,我將其拆分成三個部分。分別從移動框架與實現原理,移動的網路同步,移動元件的優化與改造三個方面來寫。這三篇文件中難免有問題和漏洞,所以我也會在發現問題時及時更新和修改,也希望大家能給出一些

Java代理模式實現與原理

關於Java中的代理,我們首先需要了解的是一種常用的設計模式——代理模式,而對於代理,可根據代理類建立的時間點,分為靜態代理和動態代理。今天我們先來了解一下Java中的靜態代理。 1 代理模式 代理模式是一種常用的設計模式,百度百科中對其定義為:為其他物件提供一個代理以控制對某個物件的訪問。

Android客戶端實現註冊/登入

前言 我們在開發安卓App時難免要與伺服器打交道,尤其是對於使用者賬號資訊的註冊與登入更是每個android開發人員必須掌握的技能,本文將對客戶端的註冊/登入功能的實現進行分析,不到之處還請指出。 在這裡我們僅討論客戶端如何請求伺服器進行註冊,而伺服器在

Menu:程式碼實現系統選單及子選單

前言:這周看到選單部分,以前也對選單有過使用,但並沒有系統的對選單進行梳理。這次藉著這個機會,對選單進行梳理。但只是很淺顯的系統講解,即對選單的種類及各種用法作了一些講述,並沒有對如何使用自定義的選單佈局做講述,等下次有機會再次遇到的時候再補充吧,一下搞太多,有點吃不消,很累

elastic-job:數據分片

count 任務 不同的 應該 center shc 偶數 int ext 數據分片的目的在於把一個任務分散到不同的機器上運行,既可以解決單機計算能力上限的問題,也能降低部分任務失敗對整體系統的影響。elastic-job並不直接提供數據處理的功能,框架只會將分片項分配至各

JVM的基本結構及其各部分

後臺 棧幀 結束 依次 方法參數 ati 0.00 實例 同時存在 JVM的基本結構及其各部分詳解(一)(轉載) 1 java虛擬機的基本結構如圖: 1)類加載子系統負責從文件系統或者網絡中加載Class信息,加載的類信息存放於一塊稱為方法區的內存空間。除了類的信息外,方

設計模式

att 定義 面向對象設計 設計 sig com 繼承 行為模式 接口 一、設計模式定義 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類的、代碼設計經驗的總結。 使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。

mybatis ------JDBC

jdbc javax 發出 一段 true his 實例 用戶名 移植 1、什麽是MyBatis?   MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,

Maven------ Maven概述

粘貼 cvs 模塊 strong ron 標準化 pom 標準 只需要 1、引言     你能搜到這個教程,說明你對 Maven 感興趣,但是又不是太理解。那麽接下來這個系列的教程將會詳細講解 Maven 的用法,相信你看完之後,一定能對 Maven 的理解更進一步!

.Net AppDomain

() arc .com args [] adas 功能 reading wpa AppDomain是CLR的運行單元,它可以加載Assembly、創建對象以及執行程序。AppDomain是CLR實現代碼隔離的基本機制。 每一個AppDomain可以單獨運行、停止;每個App

防火墻iptables

主從dns服務器 進行 所有 out show mountd 讀取 ppp 概念 -- 防火墻 常見的防火墻 :瑞星 江民 諾頓 卡巴斯基 天網...... iptables firewalld http://www.netfilter.org/ netfilter

Windows滲透利器之Pentest BOX使用

內存 標簽 配置 ram 添加 概覽 測試環境 功能 ruby 內容概覽: 知識科普 優缺點總結 功能參數詳解翻譯: 控制臺參

JVM類加載機制JVM類加載過程

進行 虛擬機啟動 類加載的時機 bsp 參與 tro ext 環境 java代碼 首先Throws(拋出)幾個自己學習過程中一直疑惑的問題: 1、什麽是類加載?什麽時候進行類加載? 2、什麽是類初始化?什麽時候進行類初始化? 3、什麽時候會為變量分配內存? 4、什麽時候會為

Java的反射機制

pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.

PHP基礎入門【世界上最好用的編程語言】

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

Zookeeper:分布式與Zookeeper

zookeeper介紹 分布式 保留本文出自 “小惡魔的家” 博客,請務必保留此出處http://littledevil.blog.51cto.com/9445436/1983260Zookeeper詳解(一):分布式與Zookeeper

dns

dns bind hosts 一:DNS(Domain Name Service),協議 二:DNS服務相關概念 三:DNS的實現方式 四:主配置文件格式 五:測試工具 六:配置正向區域 一:DNS(Domain Name Service),協議 C/S 53/{t