最近在做图片的水印功能,也就研究了一下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的selector背景选择器
  3. Android中几种图像特效处理
  4. Android应用程序资源——Drawable资源概述
  5. 浅谈android的selector背景选择器
  6. 演化理解 Android(安卓)异步加载图片
  7. android drawable文件夹说明
  8. Android中的Selector
  9. Android(安卓)imageView图片按比例缩放

随机推荐

  1. Android(安卓)数据库事务处理
  2. Android(安卓)检测系统通知栏开关是否打
  3. Android(安卓)EditText的设置
  4. 不同Activity之间传递数据--Bundle对象和
  5. Android(安卓)Canvas笔记
  6. 【安卓开发学习】6.ListView点击事…
  7. Android移植oprofile性能监测工具
  8. Real6410 Android(安卓)2.1 的 SDIO WiFi
  9. Ubuntu 环境下Android-NDK独立工具链安装
  10. android AlertDialog对话框