1.调用拍照(获取原始图片)
[java] view plain copy print ?
- 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);
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.获取本地图片进行处理并回写
[java] view plain copy print ?
- private void dealPhotoFile(final String file)
- {
- PhotoTask task = new PhotoTask(file);
- task.start();
-
- photoTasks.add(task);
- }
private void dealPhotoFile(final String file)
{
PhotoTask task = new PhotoTask(file);
task.start();
photoTasks.add(task);
}
[java] view plain copy print ?
- 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);
- 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);
-
-
- Canvas canvas = new Canvas(icon);
-
- Paint photoPaint = new Paint();
-
- photoPaint.setDither(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);
-
-
-
-
- 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 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();
}
}
}
}
[java] view plain copy print ?
- private static String getCurrTime(String pattern)
- {
- if (pattern == null)
- {
- pattern = "yyyyMMddHHmmss";
- }
- return (new SimpleDateFormat(pattern)).format(new Date());
- }
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,实在很抓狂,有时候搞半天都不知道为什么。搜索了上百个帖子都说把它压成一半,实际上我就不想压成一半,我就要这么大。我这里摸索到一个比较好的解决方法。我自己觉得百试不爽的加上这两句属性,一个是代表可以擦除的,一个代表可以共享,我现在一般不会遇到内存溢出的情况。