</pre><pre name="code" class="html"><p><span style="white-space:pre"> </span>private static final int TAKE_PICTURE = 0; <span style="white-space:pre"> </span>private static final int CHOOSE_PICTURE = 1; <span style="white-space:pre"> </span>private static final int SCALE = 2; </p><p>/**</p> * 从相机或者图库选择图片 * * @param context */ public void showPicturePicker(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); // builder.setTitle("图片来源"); builder.setNegativeButton("取消", null); builder.setItems(new String[] { "拍照", "从相册选择" }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case TAKE_PICTURE: Intent openCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); Uri imageUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory(), "image.jpg")); // 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换 openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(openCameraIntent, TAKE_PICTURE); break; case CHOOSE_PICTURE: Intent openAlbumIntent = new Intent( Intent.ACTION_GET_CONTENT); openAlbumIntent.setType("image/*"); startActivityForResult(openAlbumIntent, CHOOSE_PICTURE); break; default: break; } } }); builder.create().show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case TAKE_PICTURE: // 将保存在本地的图片取出并缩小后显示在界面上 Bitmap bitmap = BitmapFactory.decodeFile(Environment .getExternalStorageDirectory() + "/image.jpg"); Bitmap newBitmap = ImageTools.zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE);//将图片缩放SCALE倍 // 由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常 bitmap.recycle(); // 将处理过的图片显示在界面上,并保存到本地 personal_head.setImageBitmap(ImageTools.toRoundBitmap(newBitmap)); // personal_head.setImageBitmap(newBitmap); ImageTools.savePhotoToSDCard(newBitmap, Environment .getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis())); sharedPreferencer.saveBitmapToSharedPreferences( PersonalDataActivity.this, ImageTools.toRoundBitmap(newBitmap)); break; case CHOOSE_PICTURE: ContentResolver resolver = getContentResolver(); // 照片的原始资源地址 Uri originalUri = data.getData(); try { // 使用ContentProvider通过URI获取原始图片 Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri); if (photo != null) { // 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存 Bitmap smallBitmap = ImageTools.zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE); // 释放原始图片占用的内存,防止out of memory异常发生 photo.recycle(); // personal_head.setImageBitmap(smallBitmap); personal_head.setImageBitmap(ImageTools .toRoundBitmap(smallBitmap)); sharedPreferencer.saveBitmapToSharedPreferences( PersonalDataActivity.this, ImageTools.toRoundBitmap(smallBitmap)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; default: break; } } }
/** * 将图片保存在sharedpreferences * @param context * @param bitmap */ public static void saveBitmapToSharedPreferences(Context context,Bitmap bitmap){ // Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 80, byteArrayOutputStream); //第二步:利用Base64将字节数组输出流中的数据转换成字符串String byte[] byteArray=byteArrayOutputStream.toByteArray(); String imageString=new String(Base64.encodeToString(byteArray, Base64.DEFAULT)); //第三步:将String保持至SharedPreferences SharedPreferences sharedPreferences=context.getSharedPreferences("imageSP", Context.MODE_PRIVATE); Editor editor=sharedPreferences.edit(); editor.putString("image", imageString); editor.commit(); } /** * 从sharedpreference中取出图片 * @param context * @return */ public static Bitmap getBitmapFromSharedPreferences(Context context){ SharedPreferences sharedPreferences=context.getSharedPreferences("imageSP", Context.MODE_PRIVATE); //第一步:取出字符串形式的Bitmap String imageString=sharedPreferences.getString("image", ""); //第二步:利用Base64将字符串转换为ByteArrayInputStream byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray); //第三步:利用ByteArrayInputStream生成Bitmap Bitmap bitmap=BitmapFactory.decodeStream(byteArrayInputStream); return bitmap; }
/** * 把正方形的图片转换成圆的 * @param bitmap * @return */ public static Bitmap toRoundBitmap(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); float roundPx; float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom; if (width <= height) { roundPx = width / 2; top = 0; bottom = width; left = 0; right = width; height = width; dst_left = 0; dst_top = 0; dst_right = width; dst_bottom = width; } else { roundPx = height / 2; float clip = (width - height) / 2; left = clip; right = width - clip; top = 0; bottom = height; width = height; dst_left = 0; dst_top = 0; dst_right = height; dst_bottom = height; } Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom); final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom); final RectF rectF = new RectF(dst); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, src, dst, paint); return output; }