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