您的位置:首页 > 移动开发 > Android开发

Android-从图库中加载图片到屏幕并在上面画图

2015-08-25 20:27 567 查看
效果图:



权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

布局文件:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="com.example.android24.MainActivity" >

<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/chooseButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="choose"
android:text="选择图片" />

<Button
android:id="@+id/saveButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="save"
android:text="保存图片" />

</LinearLayout></span>

MainActivity.java

package com.example.android24;

import java.io.FileNotFoundException;
import java.io.OutputStream;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.MediaStore.Images.Media;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

private ImageView image;
// 画笔
private Paint paint;
// 画布
private Canvas canvas;
// 缩放后的图片
private Bitmap bitmap;
// 缩放后的图片副本
private Bitmap copyBitmap;

private Button choose;
private Button save;
private final static int RESULT = 0;

private float downx = 0;
private float downy = 0;
private float x = 0;
private float y = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取id
image = (ImageView) findViewById(R.id.image);
choose = (Button) findViewById(R.id.chooseButton);
save = (Button) findViewById(R.id.saveButton);

}

public class MyTouchListener implements OnTouchListener {

@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
// 按下
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
break;
// 移动
case MotionEvent.ACTION_MOVE:
// 路径画板
x = event.getX();
y = event.getY();
// 画线
canvas.drawLine(downx, downy, x, y, paint);
// 刷新image
image.invalidate();
downx = x;
downy = y;
break;
case MotionEvent.ACTION_UP:
break;

default:
break;
}
// true:告诉系统,这个触摸事件由我来处理
// false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点
return true;
}

}

// 选择图片
public void choose(View view) {
// 进入图库
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(intent, RESULT);
}

// 保存图片
public void save(View view) {
// 保存画好的图片
if (copyBitmap != null) {
try {
//图片的名称跟系统时间有关
// getContentResolver().insert();源码中提到
//long startTime = SystemClock.uptimeMillis();
//Uri createdRow = provider.insert(mPackageName, url, values);
//long durationMillis = SystemClock.uptimeMillis() - startTime;
//maybeLogUpdateToEventLog(durationMillis, url, "insert", null /* where */);

// 获取图库Uri路径
Uri imageUri = getContentResolver().insert(
Media.EXTERNAL_CONTENT_URI, new ContentValues());
// 获取输出流
OutputStream outputStream = getContentResolver()
.openOutputStream(imageUri);
// 将alterBitmap存入图库
copyBitmap.compress(CompressFormat.PNG, 100, outputStream);
//getApplicationContext()获取应用Activity的context
Toast.makeText(getApplicationContext(), "保存成功!",
Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

}

@Override
// 从图库中选取图片后返回
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// 获取选中的图片的Uri
Uri imageFileUri = data.getData();
// 获取屏幕大小
Display display = getWindowManager().getDefaultDisplay();
float dw = display.getWidth();
float dh = display.getHeight();

try {
// 解析图片时需要使用到的参数都封装在这个对象里了
BitmapFactory.Options options = new BitmapFactory.Options();
// 不为像素申请内存,只获取图片宽高
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageFileUri), null, options);
// 设置缩放比例
int heightRatio = (int) Math.ceil(options.outHeight / dh);
int widthRatio = (int) Math.ceil(options.outWidth / dw);
if (heightRatio > 1 && widthRatio > 1) {
if (heightRatio > widthRatio) {
options.inSampleSize = heightRatio;
} else {
options.inSampleSize = widthRatio;
}
}
// 为像素申请内存
options.inJustDecodeBounds = false;
// 获取缩放后的图片
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageFileUri), null, options);
// 创建缩放后的图片副本
copyBitmap = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), bitmap.getConfig());
// 创建画布
canvas = new Canvas(copyBitmap);
// 创建画笔
paint = new Paint();
// 设置画笔颜色
paint.setColor(Color.GREEN);
// 设置画笔宽度
paint.setStrokeWidth(10);
// 开始作画,把原图的内容绘制在白纸上
canvas.drawBitmap(bitmap, new Matrix(), paint);
// 将处理后的图片放入imageview中
image.setImageBitmap(copyBitmap);
// 设置imageview监听
image.setOnTouchListener(new MyTouchListener());
} catch (FileNotFoundException e) {

e.printStackTrace();
}

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息