国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android開發仿掃一掃實現拍攝框內的照片功能

2019-12-12 05:13:11
字體:
來源:轉載
供稿:網友

就是仿照現在掃一掃的形式,周圍是半透明的遮擋,然后中間是全透明的,拍攝后只截取框內的內容

查了很多博客,實現起來真的太復雜了,本人比較怕麻煩所以在很多地方偷懶了

先上效果圖:

第一步:設置照相機預覽以及拍照

這是所有步驟的前提,沒有預覽,用戶怎么知道自己拍的什么呢。預覽用的是SurfaceView

這篇博文寫得已經十分詳細了,打開照相機,然后拍照,而且十分簡潔!不想別的博客一下就幾百行代碼不知所云。這篇代碼可以復制下去當相機模版使用。

這里遇到一個問題,就是預覽的效果是左轉90度的,拍出來也是左轉90度的,查了很多資料,大家統一的做法就是。在相機預覽那里設置右旋90度,拍下的照片再右旋90度,具體的做法我會貼代碼

第二步:設置半透明邊框

很多博客的做法是繪圖呀什么的,太過負責。

其實如果考慮簡單點的話,只要在surfaceView上面疊加一層圖片就好了,用Framelayout布局

就是背景半透明,中間扣掉

第三步:怎么只拍攝框內的圖片

這個問題,很多博客都是長篇大論,什么矩陣運算都用上了,雖然很強,但是不想看下去。

拍攝框內的圖片,就直接拍完整張照片之后,在照片里面摳圖就好了啊。

Bitmap.createBitmap(bitmap,50,250,650,500);

自己算一下透明框大概在什么位置,左上角的坐標是什么,寬和高是什么。用上述函數就可以在原照片摳圖了。

第四步:完善一點,加入點擊對焦

其實就是在點擊事件里面調用對焦函數就行

總的代碼:

public class MainActivity extends AppCompatActivity {private SurfaceView surfaceview;private Camera camera;private Button take;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); // 沒有標題 必須在設置布局之前找到調用setContentView(R.layout.activity_main);/*getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // 設置全屏顯示WindowManager.LayoutParams.FLAG_FULLSCREEN);*/take = (Button)findViewById(R.id.take);surfaceview = (SurfaceView) findViewById(R.id.surfaceview);SurfaceHolder holder = surfaceview.getHolder();holder.setFixedSize(176, 155);// 設置分辨率holder.setKeepScreenOn(true);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// SurfaceView只有當activity顯示到了前臺,該控件才會被創建 因此需要監聽surfaceview的創建holder.addCallback(new MySurfaceCallback());//拍照按鈕take.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {takepicture();}});}//點擊事件@Overridepublic boolean onTouchEvent(MotionEvent event) {//對焦camera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean b, Camera camera) {camera.cancelAutoFocus();}});return super.onTouchEvent(event);}/*** 監聽surfaceview的創建* @author Administrator* Surfaceview只有當activity顯示到前臺,該空間才會被創建*/private final class MySurfaceCallback implements SurfaceHolder.Callback {@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubtry {// 當surfaceview創建就去打開相機camera = Camera.open();Camera.Parameters params = camera.getParameters();// Log.i("i", params.flatten());params.setJpegQuality(80); // 設置照片的質量params.setPictureSize(1024, 768);params.setPreviewFrameRate(5); // 預覽幀率camera.setParameters(params); // 將參數設置給相機//右旋90度,將預覽調正camera.setDisplayOrientation(90);// 設置預覽顯示camera.setPreviewDisplay(surfaceview.getHolder());// 開啟預覽camera.startPreview();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubif(camera != null){camera.release();camera = null;}}}//拍照的函數public void takepicture(){/** shutter:快門被按下* raw:相機所捕獲的原始數據* jpeg:相機處理的數據*/camera.takePicture(null, null, new MyPictureCallback());}//byte轉Bitmappublic Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}}//bitmap轉bytepublic byte[] Bitmap2Bytes(Bitmap bm) {ByteArrayOutputStream baos = new ByteArrayOutputStream();bm.compress(Bitmap.CompressFormat.PNG, 100, baos);return baos.toByteArray();}//照片回調函數,其實是處理照片的private final class MyPictureCallback implements Camera.PictureCallback {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// TODO Auto-generated method stubtry {Bitmap bitmap = Bytes2Bimap(data);Matrix m = new Matrix(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); m.setRotate(90);//將照片右旋90度bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m,true);Log.d("TAG","width "+width);Log.d("TAG","height "+height);//截取透明框內照片bitmap = Bitmap.createBitmap(bitmap,50,250,650,500);data = Bitmap2Bytes(bitmap);File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");FileOutputStream fos = new FileOutputStream(file);fos.write(data);// 在拍照的時候相機是被占用的,拍照之后需要重新預覽camera.startPreview();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} 

以上所述是小編給大家介紹的Android開發仿掃一掃實現拍攝框內的照片功能 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰兴市| 长寿区| 揭阳市| 盐边县| 六安市| 都安| 古浪县| 维西| 阿尔山市| 厦门市| 视频| 涿鹿县| 云林县| 沁水县| 铁力市| 稷山县| 浙江省| 靖江市| 军事| 秦安县| 昌乐县| 界首市| 镇原县| 清原| 通河县| 沽源县| 松阳县| 灯塔市| 寿阳县| 平远县| 科技| 盘锦市| 十堰市| 黄平县| 兴国县| 望谟县| 苍溪县| 重庆市| 府谷县| 潞西市| 任丘市|