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关于图片内存溢出的问题处理分享(没有实际验证)
腾讯高级开发工程师-郭大扬【Android图像处理】
实际问题解决分案分享
最有效方法
options.inPurgeable = true;
options.inInputShareable = true;
接下来讲一个比较细节的问题,我们做图像处理,老是会遇到out of memory,实在很抓狂,有时候搞半天都不知道为什么。搜索了上百个帖子都说把它压成一半,实际上我就不想压成一半,我就要这么大。我这里摸索到一个比较好的解决方法。我自己觉得百试不爽的加上这两句属性,一个是代表可以擦除的,一个代表可以共享,我现在一般不会遇到内存溢出的情况。