1.调用拍照(获取原始图片)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String ppName = "example_2012.jpg"; File f1 = new File("/sdcard/mfile/image/" + ppName); Uri u1 = Uri.fromFile(f1); intent.putExtra(MediaStore.EXTRA_OUTPUT, u1); startActivityForResult(intent, CAMERA_ACTIVITY);
2.获取本地图片进行处理并回写
private void dealPhotoFile(final String file) { PhotoTask task = new PhotoTask(file); task.start(); photoTasks.add(task); }
private class PhotoTask extends Thread { private String file; private boolean isFinished; public PhotoTask(String file) { this.file = file; } @Override public void run() { BufferedOutputStream bos = null; Bitmap icon = null; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, options); //此时返回bm为空 float percent = options.outHeight > options.outWidth ? options.outHeight / 960f : options.outWidth / 960f; if (percent < 1) { percent = 1; } int width = (int)(options.outWidth / percent); int height = (int)(options.outHeight / percent); icon = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); //初始化画布 绘制的图像到icon上 Canvas canvas = new Canvas(icon); //建立画笔 Paint photoPaint = new Paint(); //获取跟清晰的图像采样 photoPaint.setDither(true); //过滤一些 // photoPaint.setFilterBitmap(true); options.inJustDecodeBounds = false; Bitmap prePhoto = BitmapFactory.decodeFile(file); if (percent > 1) { prePhoto = Bitmap.createScaledBitmap(prePhoto, width, height, true); } canvas.drawBitmap(prePhoto, 0, 0, photoPaint); if (prePhoto != null && !prePhoto.isRecycled()) { prePhoto.recycle(); prePhoto = null; System.gc(); } //设置画笔 Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); //字体大小 textPaint.setTextSize(20.0f); //采用默认的宽度 textPaint.setTypeface(Typeface.DEFAULT); //采用的颜色 textPaint.setColor(Color.YELLOW); //阴影设置 // textPaint.setShadowLayer(3f, 1, 1, Color.DKGRAY); // 时间水印 String mark = getCurrTime("yyyy-MM-dd HH:mm:ss"); float textWidth = textPaint.measureText(mark); canvas.drawText(mark, width - textWidth - 10, height - 26, textPaint); bos = new BufferedOutputStream(new FileOutputStream(file)); int quaility = (int)(100 / percent > 80 ? 80 : 100 / percent); icon.compress(CompressFormat.JPEG, quaility, bos); bos.flush(); } catch (Exception e) { e.printStackTrace(); } finally { isFinished = true; if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (icon != null && !icon.isRecycled()) { icon.recycle(); icon = null; System.gc(); } } } }
private static String getCurrTime(String pattern) { if (pattern == null) { pattern = "yyyyMMddHHmmss"; } return (new SimpleDateFormat(pattern)).format(new Date()); }
以下转自eoe关于图片内存溢出的问题处理分享(没有实际验证)
实际问题解决分案分享
最有效方法
options.inPurgeable = true;
options.inInputShareable = true;