android实现自定义相机以及图片的水印
2016-06-26 16:34
489 查看
最近在做图片的水印功能,也就研究了一下android的相机。在android中有两种方式可以进行拍照,一种是调用系统的拍照功能调用方式比较简单而且不需要权限。
调用方式:
这样在activity的回掉取出图片设置到我们的imageView就可以了。so easy!
接下来是自定义相机实现图片的拍照效果:
ResultActivity中就是一个ImageView来显示这张图片就不贴了。另外别往了加权限
对于图片的水印效果也很简单,就是当我们得倒bitmap的时候利用paint和Canvas来
重新绘制一张bitmap参考方法如下:
通过这个方法你就可以对你的bitmap添加文字或者图片了。
调用方式:
//照相机中获取照片 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添加文字或者图片了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories