接下来这个例子使用美图秀秀的so库,反编译美图秀秀的apk后得到的so库是一个:armeabi下面的libmtimage-jni.so
很明显,我们可以推断出它的模块名称为libmtimage-jni,不的不说使用C/C++本地方法处理图片确实是非常高效!
首先我们需要把so库复制到lib下面,然后我们拿到其中的JNI.java文件,JNI.java其中封装的本地方法全是处理图片的方法,在此处我们介绍其中一个方法:
package com.xpu.mtxx;
import com.mt.mtxx.image.JNI;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Bitmap bm;
private ImageView iv;
static{
System.loadLibrary("mtimage-jni");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bm = BitmapFactory.decodeFile("sdcard/we.jpg");
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bm);
}
public void click(View v){
JNI jni = new JNI();
int[] pixels = new int[bm.getWidth() * bm.getHeight()];
//获取图片的每个像素的颜色信息
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight());
jni.StyleLomoC(pixels, bm.getWidth(), bm.getHeight());
//使用美化后的像素颜色信息重新构造图片
Bitmap bmNew = Bitmap.createBitmap(pixels, bm.getWidth(), bm.getHeight(), bm.getConfig());
iv.setImageBitmap(bmNew);
}
}