1.加载大图片到内存
数码相机照片特别大3m以上,内存吃不消,只能将原图进行缩放显示
1).通过BitmapFactory.Options 来实现,只显示原图的1/8
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inSampleSize = 8;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
imv.setImageBitmap(bmp);
2).根据当前屏幕分辨率的大小,加载图片
//得到手机屏幕的宽高.
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
windowheight = wm.getDefaultDisplay().getHeight();
windowwidth= wm.getDefaultDisplay().getWidth();
BitmapFactory.Options opts = new Options();
//不去真的解析图片 只是获取图片的头部信息 宽高
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
int imageHeight = opts.outHeight ;
int imageWidth = opts.outWidth;
System.out.println("图片宽:"+imageWidth);
System.out.println("图片高:"+imageHeight);
//计算缩放比例
int scaleX = imageWidth/windowwidth;
int scaleY = imageHeight /windowheight;
int scale = 1;
if(scaleX > scaleY & scaleY >=1){
scale = scaleX;
}
if(scaleY > scaleX & scaleX >=1){
scale = scaleY;
}
//真的解析图片
opts.inJustDecodeBounds = false;
//采样率
opts.inSampleSize = scale;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
iv.setImageBitmap(bitmap);
2.获取exif信息
ExifInterface exif = new ExifInterface("/sdcard/a.jpg");
String time = exif.getAttribute(ExifInterface.TAG_DATETIME);
System.out.println(time);
//得到拍摄设备型号
String model = exif.getAttribute(ExifInterface.TAG_MODEL);
System.out.println("model:"+model);
//把exif信息写到文件:
exif.setAttribute("ImageDescription","Something New");
3.从gallery获取图片
public void selectImage(View view) {
// 激活系统的图库应用 选择一张照片
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
if (data != null) {
Uri uri = data.getData(); // 图片的uri 路径
iv.setImageURI(uri);//注意,如果图片过大,会异常
}
} catch (Exception e) {
e.printStackTrace();
}
super.onActivityResult(requestCode, resultCode, data);
}
4.图片画画板
// 注册imagview的触摸事件
iv.setOnTouchListener(new OnTouchListener() {
int startX = 0;
int startY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("手指按下");
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
System.out.println("手指移动");
int newX = (int) event.getX();
int newY = (int) event.getY();
System.out.println("开始画线:起点坐标:("+startX+","+startY+"), --->"+"("+newX+","+newY+")");
canvas.drawLine(startX, startY, newX, newY, paint);
iv.setImageBitmap(alterBitmap);
//更新新的位置
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
System.out.println("手指离开");
break;
}
return true;
}
});
//处理返回回来的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
if (data != null) {
Uri uri = data.getData(); // 图片的uri 路径
InputStream is = getContentResolver().openInputStream(uri);
//一个不可以被修改的bitmap 只读的bitmap
Options opts = new Options();
opts.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(is, new Rect(), opts);
//创建一个空白可以被修改的bitmap 宽度 和高度 跟原图一样.
alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
//初始化 画布 用什么bitmap 作为背景 创建一个一个画布
canvas = new Canvas(alterBitmap);
canvas.drawBitmap(bitmap, new Matrix(), paint);
//初始化 画笔
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(6);
// 缩略图Bitmap bitmap = data.getParcelableExtra("data");
iv.setImageBitmap(alterBitmap);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onActivityResult(requestCode, resultCode, data);
}
效果图:
5.图片的缩放、旋转、镜面、倒影
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv1 = (ImageView) findViewById(R.id.iv_1);
iv2 = (ImageView) findViewById(R.id.iv_2);
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
iv1.setImageBitmap(bitmap1);
Bitmap alterBitmap = Bitmap.createBitmap(bitmap1.getWidth()*2, bitmap1.getHeight(), bitmap1.getConfig());
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
//矩阵
Matrix matrix = new Matrix();
/* matrix.setValues(new float[] {
2.0f, 0, 0,
0, 1, 0,
0, 0, 1
});*/
--------
//缩放效果
matrix.setScale(2.0f, 1);//缩放
--------
//旋转效果
matrix.setRotate(15,bitmap1.getWidth()/2,bitmap1.getHeight()/2);//旋转
paint.setAntiAlias(true);//消除锯齿
--------
//镜面效果
matrix.setScale(-1, 1);
matrix.postTranslate(bitmap1.getWidth(), 0);*/
--------
//倒影效果
matrix.setScale(1, -1);
matrix.postTranslate(0, bitmap1.getHeight());
--------
canvas.drawBitmap(bitmap1, matrix, paint);
iv2.setImageBitmap(alterBitmap);
}
6.图片的颜色修改
关键类:ColorMatrixpublic class MainActivity extends Activity {
private ImageView iv1;
private SeekBar sb1, sb2, sb3,sb4;
private Bitmap alterBitmap;
private Canvas canvas;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv1 = (ImageView) findViewById(R.id.iv);
final Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
alterBitmap = Bitmap.createBitmap(bitmap1.getWidth(),
bitmap1.getHeight(), bitmap1.getConfig());
canvas = new Canvas(alterBitmap);
paint = new Paint();
paint.setColor(Color.BLACK);
final Matrix matrix = new Matrix();
final ColorMatrix cm = new ColorMatrix();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
paint.setAntiAlias(true);
canvas.drawBitmap(bitmap1, matrix, paint);
iv1.setImageBitmap(alterBitmap);
sb1 = (SeekBar) findViewById(R.id.sb1);
sb2 = (SeekBar) findViewById(R.id.sb2);
sb3 = (SeekBar) findViewById(R.id.sb3);
sb4 = (SeekBar) findViewById(R.id.sb4);
sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
cm.set(new float[] {
progress/128.0f, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap1, matrix, paint);
iv1.setImageBitmap(alterBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
cm.set(new float[] {
1, 0, 0, 0, 0,
0, progress/128.0f, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap1, matrix, paint);
iv1.setImageBitmap(alterBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
sb3.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
cm.set(new float[] {
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, progress/128.0f, 0, 0,
0, 0, 0, 1, 0
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap1, matrix, paint);
iv1.setImageBitmap(alterBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
sb4.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
cm.set(new float[] {
progress/128.0f, 0, 0, 0, 0,
0, progress/128.0f, 0, 0, 0,
0, 0, progress/128.0f, 0, 0,
0, 0, 0, 1, 0
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap1, matrix, paint);
iv1.setImageBitmap(alterBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
});
}
}
7.人脸识别
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bitmap faceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
FaceDetector detector = new FaceDetector(faceBitmap.getWidth(),
faceBitmap.getHeight(), 1); // 创建识别器
Face[] mFaces = new Face[1];
int mNumFaces = detector.findFaces(faceBitmap, mFaces);
// 识别
if (mNumFaces > 0) {
for (int i = 0; i < mNumFaces; i++) {
System.out.println("找到了脸");
PointF point = new PointF();
mFaces[i].getMidPoint(point);
System.out.println("脸的中心坐标:"+point.x+","+point.y);
}
}else{
System.out.println("没找到了脸");
}
}