Android基础学习__第7天__图片的各种处理

来源:互联网 发布:淘宝代理如何发货 编辑:程序博客网 时间:2024/05/17 01:22


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);}@Overrideprotected 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;@Overridepublic 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;}});//处理返回回来的数据。@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {try {if (data != null) {Uri uri = data.getData(); // 图片的uri 路径InputStream is = getContentResolver().openInputStream(uri);//一个不可以被修改的bitmap  只读的bitmapOptions 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.图片的缩放、旋转、镜面、倒影

@Overrideprotected 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.图片的颜色修改

    关键类:ColorMatrix
public class MainActivity extends Activity {private ImageView iv1;private SeekBar sb1, sb2, sb3,sb4;private Bitmap alterBitmap;private Canvas canvas;private Paint paint;@Overrideprotected 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() {@Overridepublic 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);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}});sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic 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);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}});sb3.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic 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);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}});sb4.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic 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);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic 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("没找到了脸");}}