`
bogongjie
  • 浏览: 237748 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android camera拍摄surfaceview预览界面特定区域(该区域可移动)

阅读更多

1.自定义一个imageview用来设定surfaceview上的特定区域。

  

public class DrawImageView extends ImageView {
	private Paint paint;
	private int mFristPointX = 100, mFristPointY = 200;
	private int mSecondPointX = 400, mSecondPointY = 500;
	private boolean isFirstDown = true;

	private int mOldX = 0, mOldY = 0;

	public DrawImageView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init();
	}

	public DrawImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		init();
	}

	private void init() {
		paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.RED);
		paint.setStyle(Style.STROKE);
		paint.setStrokeWidth(2.5f);
		paint.setAlpha(100);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		canvas.drawRect(new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY()), paint);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if (event.getAction() != MotionEvent.ACTION_UP) {
			int x = (int) event.getX();
			int y = (int) event.getY();
			Rect mRect = new Rect(getmFristPointX(), getmFristPointY(), getmSecondPointX(), getmSecondPointY());
			if (mRect.contains(x, y)) {
				if (isFirstDown) {
					mOldX = x;
					mOldY = y;
					isFirstDown = false;
				} else {
					int mXDis = x - mOldX;
					int mYDis = y - mOldY;
					mOldX = x;
					mOldY = y;
					ReSetVaue(mXDis, mYDis);
				}
			}
		} else {
			isFirstDown = true;
		}
		return true;
	}

	public void setValue(int x, int y) {
		setmFristPointX(x - 50);
		setmFristPointY(y - 50);
		setmSecondPointX(x + 50);
		setmSecondPointY(y + 50);
		invalidate();
	}

	public void ReSetVaue(int xDis, int yDis) {
		setmFristPointX(getmFristPointX() + xDis);
		setmFristPointY(getmFristPointY() + yDis);
		setmSecondPointX(getmFristPointX() + 100);
		setmSecondPointY(getmFristPointY() + 100);
		invalidate();
	}

	public int getmFristPointX() {
		return mFristPointX;
	}

	public void setmFristPointX(int mFristPointX) {
		this.mFristPointX = mFristPointX;
	}

	public int getmFristPointY() {
		return mFristPointY;
	}

	public void setmFristPointY(int mFristPointY) {
		this.mFristPointY = mFristPointY;
	}

	public int getmSecondPointX() {
		return mSecondPointX;
	}

	public void setmSecondPointX(int mSecondPointX) {
		this.mSecondPointX = mSecondPointX;
	}

	public int getmSecondPointY() {
		return mSecondPointY;
	}

	public void setmSecondPointY(int mSeconPointY) {
		this.mSecondPointY = mSeconPointY;
	}

}

 2.定义xml布局。

 

  

<FrameLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="1" >

                <SurfaceView
                    android:id="@+id/open_camera"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginLeft="30dp"
                    android:layout_marginRight="30dp"
                    android:layout_marginTop="15dp" />

                <test.camera.cut.DrawImageView
                    android:id="@+id/draw_rect"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginLeft="30dp"
                    android:layout_marginRight="30dp"
                    android:layout_marginTop="15dp" />
            </FrameLayout>

 3.在surfaceChanged中设置参数开始画区域:

 

 

DrawImageView.onDraw(new Canvas());
    DrawImageView.setValue(mFirstPointX, mFirstPointY);//左上角点的值

 4.在camera拍照部分进行压缩裁剪。

private Bitmap mBitmap;

	private Camera.PictureCallback takePictureCallback = new Camera.PictureCallback() {

		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			// TODO Auto-generated method stub

			if (data != null) {
				mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
				camera.stopPreview();
			}
			Matrix matrix = new Matrix();
			matrix.setRotate(90);
			Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);

			getSurfaceSize();
			Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, SurView_Width, SurView_Height, true);
			SaveBitmap(sizeBitmap);
			mFirstPointX = mDrawImageView.getmFristPointX() + 50;
			mFirstPointY = mDrawImageView.getmFristPointY() + 50;

			Bitmap newBitmap = Bitmap.createBitmap(sizeBitmap, mFirstPointX - 50, mFirstPointY - 50, 100, 100);

			if (newBitmap != null) {
				mTestImageView.setImageBitmap(newBitmap);
			}

			camera.startPreview();

		}
	};
	
	private void getSurfaceSize(){
		SurView_Width = mSurfaceView.getWidth();
		SurView_Height = mSurfaceView.getHeight();
	}

	private void SaveBitmap(Bitmap bitmap) {
		File mpicture = new File(mPath + File.separator + "pic.jpg");
		try {
			mpicture.createNewFile();
			BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(mpicture));
			bitmap.compress(CompressFormat.JPEG, 75, outputStream);
			outputStream.flush();
			outputStream.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

 

 

参考文献:  http://blog.csdn.net/yanzi1225627/article/details/8580034

 

分享到:
评论

相关推荐

    Android开发指定区域拍照,身份证拍照,银行卡拍照

    可以使用`FrameLayout`或`RelativeLayout`作为容器,然后添加可移动和缩放的矩形框,模拟出指定区域的效果。通过监听手势操作,调整矩形框的位置和大小,满足用户在特定区域内拍照的需求。 5. **相机参数设置**: ...

    Camera 编程实例

    在Android平台上,Camera编程是开发移动应用不可或缺的一部分,特别是在创建图像捕捉、编辑或者增强现实类应用时。这个“Camera编程实例”提供了丰富的学习资源,帮助初学者深入理解Android Camera API的使用。 ...

    Android摄像头采集视频

    在Android平台上,摄像头功能是移动应用开发中不可或缺的一部分,它允许用户捕获图像和录制视频。本文将深入探讨如何在Android应用中实现摄像头采集视频的功能,包括视频的存储和捕获照片。 首先,我们需要理解...

    android zxing条码扫描源码

    - `android`:针对Android平台的特定实现,包括相机预览、图像处理和用户界面。 - `intent`:用于与独立的Zxing客户端进行交互的Intent工具类。 4. **相机预览与图像捕获** 在Android中,Zxing使用SurfaceView...

    Android摄像头传感器、定位等功能代码,可以直接运行在Android studio上面

    可以创建`Camera`对象,然后使用`setPreviewDisplay()`设置预览界面,`startPreview()`开始预览,`takePicture()`拍照。 3. Camera2 API:从Android Lollipop(API级别21)开始,推出了更强大、更灵活的Camera2 API...

    自动对焦拍照,以及可移动方框定位

    为了实现可移动的方框选择,我们需要创建一个自定义View,这个View通常继承自`View`或者`SurfaceView`。关键在于重写`onTouchEvent()`方法,监听用户的触摸事件,根据手指的滑动来改变方框的位置和大小。 1. 触摸...

    Android-Android仿微信短视频录制

    在Android平台上,微信短视频录制功能已经成为了移动应用中常见的交互元素。为了实现这一功能,开发者需要深入了解Android多媒体框架,以及如何利用系统API进行音视频的捕获、处理和存储。以下是一些关于"Android-...

    Android音视频通话例子

    在用户界面部分,Android提供了丰富的UI组件,如SurfaceView和TextureView,用于显示摄像头的预览画面。同时,也需要设计呼叫界面、接听界面和挂断界面,并处理各种状态的反馈,如来电提示、通话中状态、网络质量...

    cuter_裁剪_cuter_android_图片_barkwbd_

    同时,应用需要处理图像的显示,这可能涉及到OpenGL ES或Android的SurfaceView,以便在屏幕上实时预览和显示拍照效果。 图片裁剪功能是"Cuter"的核心,它涉及到了图像处理技术。Android提供了Bitmap类,用于处理和...

    android zbar解析二维码

    开发者通常会通过这个库来创建自己的扫描界面,提高用户在移动设备上获取和分享信息的便捷性。 该项目的核心部分是ZBar的ImageScanner类,它负责处理图像并识别其中的二维码。在Android应用中,首先需要捕获摄像头...

    android 照相 录像

    3. **设置预览视图**:使用`SurfaceView`或`TextureView`作为相机预览的显示界面。 4. **配置参数**:使用`Camera.Parameters`对象设置分辨率、闪光灯模式等参数。 5. **开始预览**:调用`startPreview()`方法开始...

    android zxing demo

    ZXing库是高度可定制的,可以根据需求调整扫描参数,如扫描区域、解码格式、扫描速度等。同时,你还可以自定义扫描结果的处理方式,比如跳转到特定页面、执行网络请求等。 **6. 注意事项** - 记得处理权限问题,如...

    android条码扫描程序源码.zip

    同时,要实现摄像头预览,需要创建`CameraPreview`类,继承自`SurfaceView`,并在其中处理摄像头参数配置、预览画面的显示以及扫描区域的设定。 3. 扫描界面设计 “1_120818212750_1.png”可能是扫描界面的设计图,...

    android自定义相机

    在Android开发中,自定义相机是一项常见的需求,它允许开发者根据特定的应用场景或者用户界面设计来定制相机功能。本文将深入探讨如何在Android平台上实现一个自定义相机,并添加手绘水印的功能。 首先,要创建...

    Android利用ZBar实现二维码、条形码扫码实例

    在Android应用开发中,有时我们需要集成二维码和条形码扫描功能,这在移动支付、信息交换等场景中非常常见。ZBar是一个强大的开源库,它提供了读取多种条码格式的能力,包括一维条形码(如EAN-13、UPC-A)和二维条码...

    Android代码-类似于放大镜源码.zip

    为了使放大镜可移动并改变放大倍数,需要监听用户的触摸事件。Android提供了`GestureDetector`和`ScaleGestureDetector`,它们可以识别滑动、单击、双击和 pinch-to-zoom(捏合缩放)等手势,从而控制放大镜的位置...

    OcrDemo文字识别系统

    在Eclipse中创建一个新的Android项目,选择合适的API级别,因为百度OCR SDK可能需要特定版本的Android支持。下载百度OCR SDK,并将其库文件(通常包含.aar或.jar文件)导入到项目的libs目录下。接着,在项目的构建...

    Android 类似于放大镜源码.zip

    5. **Camera权限**:由于放大镜可能涉及到相机使用,因此在`AndroidManifest.xml`中可能需要声明`&lt;uses-permission android:name="android.permission.CAMERA" /&gt;`,以允许应用访问设备的相机。 6. **Touch事件处理...

    Android二维码生成与扫描

    - **布局设计**:在UI布局文件中,可以创建一个SurfaceView,作为CameraSource的预览界面。同时,添加一个按钮用于启动或停止扫描。 - **代码实现**:在Activity或Fragment中,初始化ZXing的相关组件,如`...

    BarcodeScanner.zip

    BarcodeScanner使用SurfaceView作为相机预览的界面,SurfaceView可以在后台线程中处理视频流,确保流畅的显示效果。源码会展示如何设置SurfaceHolder回调,以及如何在Camera对象上设置预览尺寸和回调函数。 3. **...

Global site tag (gtag.js) - Google Analytics