杂家前文曾写过一篇关于只拍摄特定区域图片的demo,只是比较简陋,在坐标的换算上不是很严谨,而且没有完成预览界面四周暗中间亮的效果,深以为憾,今天把这个补齐了。

在上代码之前首先交代下,这里面存在着换算的两种模式。第一种,是以屏幕上的矩形区域为基准进行换算。举个例子,屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样。先将这个dip换算成px,然后根据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的一层View,这里叫MaskView(蒙板),让MaskView进行绘制。然后拍照时,通过屏幕矩形框的大小和屏幕的大小与最终拍摄图片的PictureSize进行换算,得到图片里的矩形区域图片,然后截取保存。第二种模式是,预先知道想要的图片的长宽,如我就是想截400*400(单位为px)大小的图片。那就以此为基准,换算出屏幕上呈现的Rect的长宽,然后让MaskView绘制。究竟用哪一种模式,按需选择。本文以第一种模式示例。下面上代码:

在杂家的前文基础上进行封装,首先封装一个MaskView,用来绘制四周暗中间亮的效果,或者你可以加一个滚动条,这都不是事。

一、MaskView.java

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui;  </span>

- <span style="color: black;">  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.util.DisplayUtil;  </span>

- <span style="color: black;">  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Canvas;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Color;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Paint;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Paint.Style;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Point;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Rect;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.Log;  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView;  </span>

- <span style="color: black;">  </span>

- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MaskView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> ImageView {  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">final</span> String TAG = <span class="string" style="color: red;">&#8220;YanZi&#8221;</span>;  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Paint mLinePaint;  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Paint mAreaPaint;  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Rect mCenterRect = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Context mContext;  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">public</span> MaskView(Context context, AttributeSet attrs) {  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs);  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">// TODO Auto-generated constructor stub</span>  </span>

- <span style="color: black;">        initPaint();  </span>

- <span style="color: black;">        mContext = context;  </span>

- <span style="color: black;">        Point p = DisplayUtil.getScreenMetrics(mContext);  </span>

- <span style="color: black;">        widthScreen = p.x;  </span>

- <span style="color: black;">        heightScreen = p.y;  </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initPaint(){  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">//绘制中间透明区域矩形边界的Paint</span>  </span>

- <span style="color: black;">        mLinePaint = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Paint(Paint.ANTI_ALIAS_FLAG);  </span>

- <span style="color: black;">        mLinePaint.setColor(Color.BLUE);  </span>

- <span style="color: black;">        mLinePaint.setStyle(Style.STROKE);  </span>

- <span style="color: black;">        mLinePaint.setStrokeWidth(5f);  </span>

- <span style="color: black;">        mLinePaint.setAlpha(<span class="number" style="color: #c00000;">30</span>);  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">//绘制四周阴影区域</span>  </span>

- <span style="color: black;">        mAreaPaint = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Paint(Paint.ANTI_ALIAS_FLAG);  </span>

- <span style="color: black;">        mAreaPaint.setColor(Color.GRAY);  </span>

- <span style="color: black;">        mAreaPaint.setStyle(Style.FILL);  </span>

- <span style="color: black;">        mAreaPaint.setAlpha(<span class="number" style="color: #c00000;">180</span>);  </span>

- <span style="color: black;">          </span>

- <span style="color: black;">          </span>

- <span style="color: black;">          </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setCenterRect(Rect r){  </span>

- <span style="color: black;">        Log.i(TAG, <span class="string" style="color: red;">&#8220;setCenterRect&#8230;&#8221;</span>);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mCenterRect = r;  </span>

- <span style="color: black;">        postInvalidate();  </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> clearCenterRect(Rect r){  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mCenterRect = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">int</span> widthScreen, heightScreen;  </span>

- <span style="color: black;">    <span class="annotation" style="color: #646464;">@Override</span>  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDraw(Canvas canvas) {  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span>  </span>

- <span style="color: black;">        Log.i(TAG, <span class="string" style="color: red;">&#8220;onDraw&#8230;&#8221;</span>);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mCenterRect == <span class="keyword" style="font-weight: bold; color: blue;">null</span>)  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">return</span>;  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">//绘制四周阴影区域</span>  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, widthScreen, mCenterRect.top, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, widthScreen, heightScreen, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.top, mCenterRect.left &#8211; <span class="number" style="color: #c00000;">1</span>, mCenterRect.bottom  + <span class="number" style="color: #c00000;">1</span>, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(mCenterRect.right + <span class="number" style="color: #c00000;">1</span>, mCenterRect.top, widthScreen, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, mAreaPaint);  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">//绘制目标透明区域</span>  </span>

- <span style="color: black;">        canvas.drawRect(mCenterRect, mLinePaint);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onDraw(canvas);  </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">}  </span>

- <span style="color: black;"></span>  </span>

说明如下:

 

1、为了让这个MaskView有更好的适配型,里面设置变量mCenterRect,这个矩阵的坐标就是已经换算好的,对屏幕的尺寸进行适配过的,以全屏下的屏幕宽高为坐标系,不需要再换算了。

2、当然这个MaskView是全屏的,这里修改下PlayCamera_V1.0.0中的一个小问题,我将它的布局换成如下:

 

**[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>  </span>

- <span style="color: black;">    <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span>  </span>

- <span style="color: black;">    <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span>  </span>

- <span style="color: black;">    <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span>  </span>

- <span style="color: black;">    <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.CameraActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">></span>  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">FrameLayout</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">></span>  </span>

- <span style="color: black;">        <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.camera.preview.CameraSurfaceView</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/camera_surfaceview&#8221;</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;0dip&#8221;</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;0dip&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">/></span>  </span>

- <span style="color: black;">        <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.MaskView</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/view_mask&#8221;</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span>  </span>

- <span style="color: black;">            <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">/></span>  </span>

- <span style="color: black;">    <span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">FrameLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span>  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageButton</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/btn_shutter&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_alignParentBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_centerHorizontal</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:layout_marginBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;10dip&#8221;</span>  </span>

- <span style="color: black;">        <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/btn_shutter_background&#8221;</span> <span class="tag" style="font-weight: bold; color: blue;">/></span>  </span>

- <span style="color: black;">  </span>

- <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span>  </span>

更改的地方是让FrameLayout直接全屏,不要设置成wrap_content,如果设它为wrap,代码里调整Surfaceview的大小,而MaskView设为wrap的话,它会认为MaskView的长宽也是0.另外,让Framelayout全屏,在日后16:9和4:3切换时,可以通过设置Surfaceview的margin来调整预览布局的大小,所以预览的母布局FrameLayout必须全屏。

 

3.关于绘制阴影区域的代码里的+1 -1这几个小地方尽量不要错,按本文写就不会错。顺序是先绘制最上面、最下面、左侧、右侧四个区域的阴影。

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>><span class="comment" style="color: #008200;">//绘制四周阴影区域</span>  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, widthScreen, mCenterRect.top, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, widthScreen, heightScreen, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.top, mCenterRect.left &#8211; <span class="number" style="color: #c00000;">1</span>, mCenterRect.bottom  + <span class="number" style="color: #c00000;">1</span>, mAreaPaint);  </span>

- <span style="color: black;">        canvas.drawRect(mCenterRect.right + <span class="number" style="color: #c00000;">1</span>, mCenterRect.top, widthScreen, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, mAreaPaint);</span>  </span>

 

二、在CameraActivity.java里封装两个函数:

 

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>    <span class="comment" style="color: #008200;">/**生成拍照后图片的中间矩形的宽度和高度</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @param w 屏幕上的矩形宽度,单位px</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @param h 屏幕上的矩形高度,单位px</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @return</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     */</span>  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Point createCenterPictureRect(<span class="keyword" style="font-weight: bold; color: blue;">int</span> w, <span class="keyword" style="font-weight: bold; color: blue;">int</span> h){  </span>

- <span style="color: black;">          </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> wScreen = DisplayUtil.getScreenMetrics(<span class="keyword" style="font-weight: bold; color: blue;">this</span>).x;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> hScreen = DisplayUtil.getScreenMetrics(<span class="keyword" style="font-weight: bold; color: blue;">this</span>).y;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> wSavePicture = CameraInterface.getInstance().doGetPrictureSize().y; <span class="comment" style="color: #008200;">//因为图片旋转了,所以此处宽高换位</span>  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> hSavePicture = CameraInterface.getInstance().doGetPrictureSize().x; <span class="comment" style="color: #008200;">//因为图片旋转了,所以此处宽高换位</span>  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">float</span> wRate = (<span class="keyword" style="font-weight: bold; color: blue;">float</span>)(wSavePicture) / (<span class="keyword" style="font-weight: bold; color: blue;">float</span>)(wScreen);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">float</span> hRate = (<span class="keyword" style="font-weight: bold; color: blue;">float</span>)(hSavePicture) / (<span class="keyword" style="font-weight: bold; color: blue;">float</span>)(hScreen);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">float</span> rate = (wRate <= hRate) ? wRate : hRate;<span class="comment" style="color: #008200;">//也可以按照最小比率计算</span>  </span>

- <span style="color: black;">          </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> wRectPicture = (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)( w * wRate);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> hRectPicture = (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)( h * hRate);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">new</span> Point(wRectPicture, hRectPicture);  </span>

- <span style="color: black;">          </span>

- <span style="color: black;">    }  </span>

- <span style="color: black;">    <span class="comment" style="color: #008200;">/**</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * 生成屏幕中间的矩形</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @param w 目标矩形的宽度,单位px</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @param h 目标矩形的高度,单位px</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * @return</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     */</span>  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">private</span> Rect createCenterScreenRect(<span class="keyword" style="font-weight: bold; color: blue;">int</span> w, <span class="keyword" style="font-weight: bold; color: blue;">int</span> h){  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> x1 = DisplayUtil.getScreenMetrics(<span class="keyword" style="font-weight: bold; color: blue;">this</span>).x / <span class="number" style="color: #c00000;">2</span> &#8211; w / <span class="number" style="color: #c00000;">2</span>;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> y1 = DisplayUtil.getScreenMetrics(<span class="keyword" style="font-weight: bold; color: blue;">this</span>).y / <span class="number" style="color: #c00000;">2</span> &#8211; h / <span class="number" style="color: #c00000;">2</span>;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> x2 = x1 + w;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> y2 = y1 + h;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">new</span> Rect(x1, y1, x2, y2);  </span>

- <span style="color: black;">    }</span>  </span>

分别是生成图片的中间矩形的宽和高组成的一个Point,生成屏幕中间的矩形区域。两个函数的输入参数都是px为单位的屏幕中间矩形的宽和高。这里有个条件:矩形以屏幕中心为中心,否则的话计算公式要适当变换下

 

三、在开启预览后,就可以让MaskView绘制了

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>    <span class="annotation" style="color: #646464;">@Override</span>  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> cameraHasOpened() {  </span>

- <span style="color: black;">        <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span>  </span>

- <span style="color: black;">        SurfaceHolder holder = surfaceView.getSurfaceHolder();  </span>

- <span style="color: black;">        CameraInterface.getInstance().doStartPreview(holder, previewRate);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">if</span>(maskView != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){  </span>

- <span style="color: black;">            Rect screenCenterRect = createCenterScreenRect(DisplayUtil.dip2px(<span class="keyword" style="font-weight: bold; color: blue;">this</span>, DST_CENTER_RECT_WIDTH)  </span>

- <span style="color: black;">                    ,DisplayUtil.dip2px(<span class="keyword" style="font-weight: bold; color: blue;">this</span>, DST_CENTER_RECT_HEIGHT));  </span>

- <span style="color: black;">            maskView.setCenterRect(screenCenterRect);  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">    }</span>  </span>

这里有个注意事项:因为camera.open的时候是放在一个单独线程里的,open之后进行回调到cameraHasOpened()这里,那这个函数的执行时在主线程和子线程?答案也是在子线程,即子线程的回调还是在子线程里执行。正因此,在封装MaskView时set矩阵后用的是postInvalidate()进行刷新的。

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>    <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setCenterRect(Rect r){  </span>

- <span style="color: black;">        Log.i(TAG, <span class="string" style="color: red;">&#8220;setCenterRect&#8230;&#8221;</span>);  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mCenterRect = r;  </span>

- <span style="color: black;">        postInvalidate();  </span>

- <span style="color: black;">    }</span>  </span>

 

四、最后就是告诉拍照的回调了

 

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> BtnListeners <span class="keyword" style="font-weight: bold; color: blue;">implements</span> OnClickListener{  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">        <span class="annotation" style="color: #646464;">@Override</span>  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onClick(View v) {  </span>

- <span style="color: black;">            <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span>  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">switch</span>(v.getId()){  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">case</span> R.id.btn_shutter:  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">if</span>(rectPictureSize == <span class="keyword" style="font-weight: bold; color: blue;">null</span>){  </span>

- <span style="color: black;">                    rectPictureSize = createCenterPictureRect(DisplayUtil.dip2px(CameraActivity.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, DST_CENTER_RECT_WIDTH)  </span>

- <span style="color: black;">                            ,DisplayUtil.dip2px(CameraActivity.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, DST_CENTER_RECT_HEIGHT));  </span>

- <span style="color: black;">                }  </span>

- <span style="color: black;">                CameraInterface.getInstance().doTakePicture(rectPictureSize.x, rectPictureSize.y);  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">break</span>;  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">default</span>:<span class="keyword" style="font-weight: bold; color: blue;">break</span>;  </span>

- <span style="color: black;">            }  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">    }</span>  </span>

上面是拍照的监听,在CameraInterface里重写一个doTakePicture函数:

 

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>    <span class="keyword" style="font-weight: bold; color: blue;">int</span> DST_RECT_WIDTH, DST_RECT_HEIGHT;  </span>

- <span style="color: black;">    <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> doTakePicture(<span class="keyword" style="font-weight: bold; color: blue;">int</span> w, <span class="keyword" style="font-weight: bold; color: blue;">int</span> h){  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">if</span>(isPreviewing && (mCamera != <span class="keyword" style="font-weight: bold; color: blue;">null</span>)){  </span>

- <span style="color: black;">            Log.i(TAG, <span class="string" style="color: red;">&#8220;矩形拍照尺寸:width = &#8220;</span> + w + <span class="string" style="color: red;">&#8221; h = &#8220;</span> + h);  </span>

- <span style="color: black;">            DST_RECT_WIDTH = w;  </span>

- <span style="color: black;">            DST_RECT_HEIGHT = h;  </span>

- <span style="color: black;">            mCamera.takePicture(mShutterCallback, <span class="keyword" style="font-weight: bold; color: blue;">null</span>, mRectJpegPictureCallback);  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">    }</span>  </span>

这里出来个mRectJpegPictureCallback,它对应的类:

 

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>><span class="comment" style="color: #008200;">/**</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     * 拍摄指定区域的Rect</span> </span>

- <span style="color: black;"><span class="comment" style="color: #008200;">     */</span>  </span>

- <span style="color: black;">    PictureCallback mRectJpegPictureCallback = <span class="keyword" style="font-weight: bold; color: blue;">new</span> PictureCallback()   </span>

- <span style="color: black;">    <span class="comment" style="color: #008200;">//对jpeg图像数据的回调,最重要的一个回调</span>  </span>

- <span style="color: black;">    {  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onPictureTaken(<span class="keyword" style="font-weight: bold; color: blue;">byte</span>[] data, Camera camera) {  </span>

- <span style="color: black;">            <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span>  </span>

- <span style="color: black;">            Log.i(TAG, <span class="string" style="color: red;">&#8220;myJpegCallback:onPictureTaken&#8230;&#8221;</span>);  </span>

- <span style="color: black;">            Bitmap b = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">if</span>(<span class="keyword" style="font-weight: bold; color: blue;">null</span> != data){  </span>

- <span style="color: black;">                b = BitmapFactory.decodeByteArray(data, <span class="number" style="color: #c00000;"></span>, data.length);<span class="comment" style="color: #008200;">//data是字节数据,将其解析成位图</span>  </span>

- <span style="color: black;">                mCamera.stopPreview();  </span>

- <span style="color: black;">                isPreviewing = <span class="keyword" style="font-weight: bold; color: blue;">false</span>;  </span>

- <span style="color: black;">            }  </span>

- <span style="color: black;">            <span class="comment" style="color: #008200;">//保存图片到sdcard</span>  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">if</span>(<span class="keyword" style="font-weight: bold; color: blue;">null</span> != b)  </span>

- <span style="color: black;">            {  </span>

- <span style="color: black;">                <span class="comment" style="color: #008200;">//设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set(&#8220;rotation&#8221;, 90)失效。</span>  </span>

- <span style="color: black;">                <span class="comment" style="color: #008200;">//图片竟然不能旋转了,故这里要旋转下</span>  </span>

- <span style="color: black;">                Bitmap rotaBitmap = ImageUtil.getRotateBitmap(b, <span class="number" style="color: #c00000;">90</span>.0f);  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">int</span> x = rotaBitmap.getWidth()/<span class="number" style="color: #c00000;">2</span> &#8211; DST_RECT_WIDTH/<span class="number" style="color: #c00000;">2</span>;  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">int</span> y = rotaBitmap.getHeight()/<span class="number" style="color: #c00000;">2</span> &#8211; DST_RECT_HEIGHT/<span class="number" style="color: #c00000;">2</span>;  </span>

- <span style="color: black;">                Log.i(TAG, <span class="string" style="color: red;">&#8220;rotaBitmap.getWidth() = &#8220;</span> + rotaBitmap.getWidth()  </span>

- <span style="color: black;">                        + <span class="string" style="color: red;">&#8221; rotaBitmap.getHeight() = &#8220;</span> + rotaBitmap.getHeight());  </span>

- <span style="color: black;">                Bitmap rectBitmap = Bitmap.createBitmap(rotaBitmap, x, y, DST_RECT_WIDTH, DST_RECT_HEIGHT);  </span>

- <span style="color: black;">                FileUtil.saveBitmap(rectBitmap);  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">if</span>(rotaBitmap.isRecycled()){  </span>

- <span style="color: black;">                    rotaBitmap.recycle();  </span>

- <span style="color: black;">                    rotaBitmap = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">                }  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">if</span>(rectBitmap.isRecycled()){  </span>

- <span style="color: black;">                    rectBitmap.recycle();  </span>

- <span style="color: black;">                    rectBitmap = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">                }  </span>

- <span style="color: black;">            }  </span>

- <span style="color: black;">            <span class="comment" style="color: #008200;">//再次进入预览</span>  </span>

- <span style="color: black;">            mCamera.startPreview();  </span>

- <span style="color: black;">            isPreviewing = <span class="keyword" style="font-weight: bold; color: blue;">true</span>;  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!b.isRecycled()){  </span>

- <span style="color: black;">                b.recycle();  </span>

- <span style="color: black;">                b = <span class="keyword" style="font-weight: bold; color: blue;">null</span>;  </span>

- <span style="color: black;">            }  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">    };</span>  </span>

 

注意事项:

 

1、为了让截出的区域和屏幕上显示的完全一致,这里首先要满足PreviewSize长宽比、PictureSize长宽比、屏幕预览Surfaceview的长宽比为同一比例,这是个先决条件。然后再将屏幕矩形区域长宽换算成图片矩形区域时:

/**生成拍照后图片的中间矩形的宽度和高度

  • @param w 屏幕上的矩形宽度,单位px
  • @param h 屏幕上的矩形高度,单位px
  • @return
    */
    private Point createCenterPictureRect(int w, int h){

int wScreen = DisplayUtil.getScreenMetrics(this).x;
int hScreen = DisplayUtil.getScreenMetrics(this).y;
int wSavePicture = CameraInterface.getInstance().doGetPrictureSize().y; //因为图片旋转了,所以此处宽高换位
int hSavePicture = CameraInterface.getInstance().doGetPrictureSize().x; //因为图片旋转了,所以此处宽高换位
float wRate = (float)(wSavePicture) / (float)(wScreen);
float hRate = (float)(hSavePicture) / (float)(hScreen);
float rate = (wRate <= hRate) ? wRate : hRate;//也可以按照最小比率计算

int wRectPicture = (int)( w * wRate);
int hRectPicture = (int)( h * hRate);
return new Point(wRectPicture, hRectPicture);

}

原则上wRate 是应该等于hRate 的!!!!!!!!!!

2、我对CamParaUtil里的getPropPreviewSize和getPropPictureSize进行了更新,以前是以width进行判断的,这里改成了以height进行判断。因为在读取参数时得到的是800*480(宽*高)这种类型,一般高是稍微小的,所以以height进行判断。而这个高在最终显示和保存时经过旋转又成了宽。

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>    <span class="keyword" style="font-weight: bold; color: blue;">public</span> Size getPropPictureSize(List<Camera.Size> list, <span class="keyword" style="font-weight: bold; color: blue;">float</span> th, <span class="keyword" style="font-weight: bold; color: blue;">int</span> minHeight){  </span>

- <span style="color: black;">        Collections.sort(list, sizeComparator);  </span>

- <span style="color: black;">  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>;  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">for</span>(Size s:list){  </span>

- <span style="color: black;">            <span class="keyword" style="font-weight: bold; color: blue;">if</span>((s.height >= minHeight) && equalRate(s, th)){  </span>

- <span style="color: black;">                Log.i(TAG, <span class="string" style="color: red;">&#8220;PictureSize : w = &#8220;</span> + s.width + <span class="string" style="color: red;">&#8220;h = &#8220;</span> + s.height);  </span>

- <span style="color: black;">                <span class="keyword" style="font-weight: bold; color: blue;">break</span>;  </span>

- <span style="color: black;">            }  </span>

- <span style="color: black;">            i++;  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">if</span>(i == list.size()){  </span>

- <span style="color: black;">            i = <span class="number" style="color: #c00000;"></span>;<span class="comment" style="color: #008200;">//如果没找到,就选最小的size</span>  </span>

- <span style="color: black;">        }  </span>

- <span style="color: black;">        <span class="keyword" style="font-weight: bold; color: blue;">return</span> list.get(i);  </span>

- <span style="color: black;">    }</span>  </span>

最后来看下效果吧,我设定屏幕上显示的矩形尺寸为200dip*200dip, Camera预览的参数是以屏幕的比例进行自动寻找,预览尺寸的height不小于400,PictureSize的height不小于1300.

 

 

**[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/407657)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/407657/fork)
  <div>
  </div>
</div>
- <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>>            <span class="comment" style="color: #008200;">//设置PreviewSize和PictureSize</span>  </span>

- <span style="color: black;">            Size pictureSize = CamParaUtil.getInstance().getPropPictureSize(  </span>

- <span style="color: black;">                    mParams.getSupportedPictureSizes(),previewRate, <span class="number" style="color: #c00000;">1300</span>);  </span>

- <span style="color: black;">            mParams.setPictureSize(pictureSize.width, pictureSize.height);  </span>

- <span style="color: black;">            Size previewSize = CamParaUtil.getInstance().getPropPreviewSize(  </span>

- <span style="color: black;">                    mParams.getSupportedPreviewSizes(), previewRate, <span class="number" style="color: #c00000;">400</span>);  </span>

- <span style="color: black;">            mParams.setPreviewSize(previewSize.width, previewSize.height);</span>  </span>
![](http://yspe2371e4aa7697989.yunshipei.cn/dHlwZT1mdyZzaXplPTY0MCZzcmM9YUhSMGNDVXpRU1V5UmlVeVJtbHRaeTVpYkc5bkxtTnpaRzR1Ym1WMEpUSkdNakF4TkRBMk1qWXlNakF6TkRJMU56Z2xNMFozWVhSbGNtMWhjbXNsTWtZeUpUSkdkR1Y0ZENVeVJtRklVakJqUkc5MlRESktjMkl5WTNWWk0wNXJZbWsxZFZwWVVYWmxWMFoxWlcxcmVFMXFTVEZPYWtrekpUSkdabTl1ZENVeVJqVmhOa3cxVERKVUpUSkdabTl1ZEhOcGVtVWxNa1kwTURBbE1rWm1hV3hzSlRKR1NUQktRbEZyUmtOTlFTVXpSQ1V6UkNVeVJtUnBjM052YkhabEpUSkdOekFsTWtabmNtRjJhWFI1SlRKR1EyVnVkR1Z5)

 

 

 

![](http://yspe2371e4aa7697989.yunshipei.cn/dHlwZT1mdyZzaXplPTY0MCZzcmM9YUhSMGNDVXpRU1V5UmlVeVJtbHRaeTVpYkc5bkxtTnpaRzR1Ym1WMEpUSkdNakF4TkRBMk1qWXlNakl4TURRd056Z2xNMFozWVhSbGNtMWhjbXNsTWtZeUpUSkdkR1Y0ZENVeVJtRklVakJqUkc5MlRESktjMkl5WTNWWk0wNXJZbWsxZFZwWVVYWmxWMFoxWlcxcmVFMXFTVEZPYWtrekpUSkdabTl1ZENVeVJqVmhOa3cxVERKVUpUSkdabTl1ZEhOcGVtVWxNa1kwTURBbE1rWm1hV3hzSlRKR1NUQktRbEZyUmtOTlFTVXpSQ1V6UkNVeVJtUnBjM052YkhabEpUSkdOekFsTWtabmNtRjJhWFI1SlRKR1EyVnVkR1Z5)
可以看到单纯的截取是不改变图像分辨率的,注意真正的分辨率的概念并不等于xxx * xxx,图片放的越大越不清楚。稍后推出矩形区域可以移动、且可拉伸的,拍摄任意位置的特定区域图片demo。
——————————-本文系原创,转载请注明作者:yanzi1225627
代码下载链接:
csdn:[http://download.csdn.net/detail/yanzi1225627/7557539](http://download.csdn.net/detail/yanzi1225627/7557539)

💬 评论