最近在做图片的水印功能,也就研究了一下android的相机。在android中有两种方式可以进行拍照,一种是调用系统的拍照功能调用方式比较简单而且不需要权限。
调用方式:

  //照相机中获取照片    public void getPhoto_FromCamera() {        try {            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 下面这句指定调用相机拍照后的照片存储的路径            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri                    .fromFile(new File(Environment.getExternalStorageDirectory(), "photo.jpg")));            startActivityForResult(intent, 1);        } catch (ActivityNotFoundException e) {            e.printStackTrace();        }    }

这样在activity的回掉取出图片设置到我们的imageView就可以了。so easy!

接下来是自定义相机实现图片的拍照效果:

package qjdt.iwintrue.com.cameraapplication;import android.content.Intent;import android.graphics.ImageFormat;import android.hardware.Camera;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class CustomerCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback  {    //声明一个camera对象    private  Camera  camera;    //图片的实时预览    private SurfaceView suf_camera;    private SurfaceHolder surfaceHolder;    //相机参数设置    private Camera.Parameters parameters;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_customer_camera);        suf_camera = (SurfaceView) findViewById(R.id.suf_camera);        surfaceHolder =  suf_camera.getHolder();        surfaceHolder.addCallback(this);    }    public void click(View view) {        switch (view.getId()){            case R.id.btn_start:                takePhoto();            break;            case R.id.btn_stop:                break;        }    }    public void takePhoto(){        parameters = camera.getParameters();        //设置照片格式        parameters.setPictureFormat(ImageFormat.JPEG);        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);        parameters.setPictureSize(400, 800);        camera.autoFocus(new Camera.AutoFocusCallback() {            @Override            public void onAutoFocus(boolean success, Camera camera) {                camera.takePicture(null, null, new Camera.PictureCallback() {                    @Override                    public void onPictureTaken(byte[] data, Camera camera) {                        try {                            FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"temp.jpeg"));                            fileOutputStream.write(data);                            fileOutputStream.close();                            Intent intent  = new Intent(CustomerCameraActivity.this,ResultActivity.class);                            startActivity(intent);                        } catch (FileNotFoundException e) {                            e.printStackTrace();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                });            }        });//        camera.takePicture();    }    public  void  getCamera(){        //获取相机实例        if(camera==null)        camera = Camera.open();    }    public void releaseCamera(){        if(camera!=null){            camera.setPreviewCallback(null);            camera.stopPreview();            camera.release();            camera = null;        }    }    public  void  setPrive(Camera camera,SurfaceHolder surfaceHolder){        try {            camera.setPreviewDisplay(surfaceHolder);            //开始预览            camera.setDisplayOrientation(90);            camera.startPreview();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    protected void onResume() {        super.onResume();        getCamera();        if(surfaceHolder!=null){            setPrive(camera,surfaceHolder);        }    }    @Override    protected void onPause() {        super.onPause();        releaseCamera();    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        setPrive(camera,surfaceHolder);    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        camera.stopPreview();        setPrive(camera, surfaceHolder);    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        releaseCamera();    }}

ResultActivity中就是一个ImageView来显示这张图片就不贴了。另外别往了加权限

对于图片的水印效果也很简单,就是当我们得倒bitmap的时候利用paint和Canvas来
重新绘制一张bitmap参考方法如下:

  // 加水印 也可以加文字    public static Bitmap watermarkBitmap(Bitmap src, Bitmap watermark,                                         String title) {        if (src == null) {            return null;        }        int w = src.getWidth();        int h = src.getHeight();        //需要处理图片太大造成的内存超过的问题,这里我的图片很小所以不写相应代码了        Bitmap newb= Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图        Canvas cv = new Canvas(newb);        cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src        Paint paint=new Paint();        //加入图片        if (watermark != null) {            int ww = watermark.getWidth();            int wh = watermark.getHeight();            paint.setAlpha(50);            cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, paint);// 在src的右下角画入水印        }        //加入文字        if(title!=null)        {            String familyName ="黑体";            Typeface font = Typeface.create(familyName,Typeface.NORMAL);            TextPaint textPaint=new TextPaint();            textPaint.setColor(Color.RED);            textPaint.setTypeface(font);            textPaint.setTextSize(100);            //这里是自动换行的            StaticLayout layout = new StaticLayout(title,textPaint,w,Layout.Alignment.ALIGN_NORMAL,1.0F,0.0F,true);            layout.draw(cv);        }        cv.save(Canvas.ALL_SAVE_FLAG);// 保存        cv.restore();// 存储        return newb;    }

通过这个方法你就可以对你的bitmap添加文字或者图片了。

更多相关文章

  1. Android使用BitmapFactory.Options解决加载大图片内存溢出问题
  2. Android 图片选择器
  3. 用layer-list一次加载多个层次图片
  4. android 自定义ratingbar 图片显示不全的解决方案
  5. Android 读取手机音乐,视频,图片
  6. Android .9图片使用报错...报错:AAPT: error: file failed to co

随机推荐

  1. 解析如何在sqlserver代理中配置邮件会话
  2. 深入sql server 2005 万能分页存储过程的
  3. 在SQL Server 2005中创建CLR存储过程的详
  4. SQL Server 2005 创建简单的存储过程--总
  5. 图解SSIS批量导入Excel文件的实现方法
  6. 深入SQL Cursor基本用法的详细介绍
  7. 解决无法在unicode和非unicode字符串数据
  8. 探讨SQL compute by的使用分析
  9. sql server日期相减 的实现详解
  10. 深入SQL Server中定长char(n)与变长varch