android實(shí)現(xiàn)圖片裁剪的兩種方法
兩種android圖片裁剪方式,供大家參考,具體內(nèi)容如下
一、相機(jī)拍完照之后利用系統(tǒng)自帶裁剪工具進(jìn)行截取
public static void cropImage(Activity activity, Uri srcUri) { cropImageUri = srcUri; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(srcUri, "image/*"); intent.putExtra("crop", "true"); // 1.寬高和比例都不設(shè)置時(shí),裁剪框可以自行調(diào)整(比例和大小都可以隨意調(diào)整) //////////////////////////////////////////////////////////////// // 2.只設(shè)置裁剪框?qū)捀弑?aspect)后,裁剪框比例固定不可調(diào)整,只能調(diào)整大小 //////////////////////////////////////////////////////////////// // 3.裁剪后生成圖片寬高(output)的設(shè)置和裁剪框無(wú)關(guān),只決定最終生成圖片大小 //////////////////////////////////////////////////////////////// // 4.裁剪框?qū)捀弑壤?aspect)可以和裁剪后生成圖片比例(output)不同,此時(shí), // 會(huì)以裁剪框的寬為準(zhǔn),按照裁剪寬高比例生成一個(gè)圖片,該圖和框選部分可能不同, // 不同的情況可能是截取框選的一部分,也可能超出框選部分,向下延伸補(bǔ)足 //////////////////////////////////////////////////////////////// // aspectX aspectY 是裁剪框?qū)捀叩谋壤? // intent.putExtra("aspectX", 1); // intent.putExtra("aspectY", 1); // // outputX outputY 是裁剪后生成圖片的寬高 // intent.putExtra("outputX", 300); // intent.putExtra("outputY", 300); // return-data為true時(shí),會(huì)直接返回bitmap數(shù)據(jù),但是大圖裁剪時(shí)會(huì)出現(xiàn)問(wèn)題,推薦下面為false時(shí)的方式 // return-data為false時(shí),不會(huì)返回bitmap,但需要指定一個(gè)MediaStore.EXTRA_OUTPUT保存圖片uri intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri); intent.putExtra("return-data", false); activity.startActivityForResult(intent, CROP_IMAGE); }
這樣圖片可以通過(guò)手勢(shì)來(lái)自由裁剪
二、自定義相機(jī)拍照界面,裁剪固定區(qū)域的圖片
這里用到了一個(gè)叫idcardcamera的三方,在此向原作者致敬,附上項(xiàng)目引用地址 ‘com.github.wildma:IDCardCamera:1.0.0'
有幾個(gè)地方,需要修改一下,我是在相機(jī)中間加了一個(gè)長(zhǎng)方形的框,代碼片段如下:
float screenMinSize = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels); //根據(jù)screenMinSize,計(jì)算出cameraPreview的較寬的一邊,長(zhǎng)寬比為標(biāo)準(zhǔn)的16:9 float maxSize = screenMinSize / 9.0f * 16.0f; RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams((int) maxSize, (int) screenMinSize); layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); mCameraPreview.setLayoutParams(layoutParams); float height = (int) (screenMinSize * 0.3); float density = getResources().getDisplayMetrics().density; // 屏幕密度(0.75 / 1.0 / 1.5) float mywdith =(int) 136*density; int widthPixels = getResources().getDisplayMetrics().widthPixels; float width = (int) (widthPixels-mywdith);//75 47 LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams((int) width, ViewGroup.LayoutParams.MATCH_PARENT); LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height); mLlCameraCropContainer.setLayoutParams(containerParams); mIvCameraCrop.setLayoutParams(cropParams);
修改了 mIvCameraCrop的大小,給這個(gè)長(zhǎng)方形框添加一個(gè)背景邊框,剛開(kāi)始老是顯示不出來(lái)右邊的邊框,后來(lái)發(fā)現(xiàn),拍照按鈕父布局的寬度為136dp,用代碼計(jì)算出實(shí)際占用的px,然后設(shè)置長(zhǎng)方形的合適寬度,這樣就遮擋不住了,右邊的邊框就能夠顯示出來(lái)了,附上拍照的邏輯,選擇自動(dòng)剪裁
/** * 拍照 */ private void takePhoto() { mCameraPreview.setEnabled(false); mCameraPreview.takePhoto(new Camera.PictureCallback() { @Override public void onPictureTaken(final byte[] data, Camera camera) { // camera.stopPreview(); camera.startPreview(); //子線程處理圖片,防止ANR // setCropLayout(); new Thread(new Runnable() { @Override public void run() { bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); String imagePath = path; ImageUtils.save(bitmap, imagePath, Bitmap.CompressFormat.JPEG); int rotation = getWindowManager().getDefaultDisplay().getRotation(); int angle = ImageUtils.getBitmapDegree(imagePath); if (mOrientation==90){ bitmap = ImageUtils.rotateBitmap(CameraActivity.this.bitmap, 180); } /** * 計(jì)算裁剪位置 */ float left, top, right, bottom; left = ((float) mLlCameraCropContainer.getLeft() - (float) mCameraPreview.getLeft()) / (float) mCameraPreview.getWidth(); top = (float) mIvCameraCrop.getTop() / (float) mCameraPreview.getHeight(); right = (float) mLlCameraCropContainer.getRight() / (float) mCameraPreview.getWidth(); bottom = (float) mIvCameraCrop.getBottom() / (float) mCameraPreview.getHeight(); /** * 自動(dòng)裁剪 **/ mCropBitmap = Bitmap.createBitmap(bitmap, (int) (left * (float) bitmap.getWidth()), (int) (top * (float) bitmap.getHeight()), (int) ((right - left) * (float) bitmap.getWidth()), (int) ((bottom - top) * (float) bitmap.getHeight())); /** * 手動(dòng)裁剪 **/ runOnUiThread(new Runnable() { @Override public void run() { //將裁剪區(qū)域設(shè)置成與掃描框一樣大 setCropLayout(); mCropImageView.setLayoutParams(new LinearLayout.LayoutParams(mIvCameraCrop.getWidth(), mIvCameraCrop.getHeight())); mCropImageView.setImageBitmap( mCropBitmap); } }); } }).start(); safeToTakePicture = true; } }); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android調(diào)用系統(tǒng)圖片裁剪限定尺寸及7.0照相問(wèn)題的解決方法
- Android實(shí)現(xiàn)拍照及圖片裁剪(6.0以上權(quán)限處理及7.0以上文件管理)
- android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法
- Android ImageView實(shí)現(xiàn)圖片裁剪和顯示功能
- Android 7.0中拍照和圖片裁剪適配的問(wèn)題詳解
- Android圖片裁剪功能實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)相機(jī)拍攝、選擇、圖片裁剪功能
- Android開(kāi)發(fā)從相機(jī)或相冊(cè)獲取圖片裁剪
- 使用Java代碼在Android中實(shí)現(xiàn)圖片裁剪功能
相關(guān)文章
一文帶你了解Android中的網(wǎng)絡(luò)請(qǐng)求
安卓開(kāi)發(fā)網(wǎng)絡(luò)請(qǐng)求可謂是安卓開(kāi)發(fā)的靈魂,如果你不會(huì)網(wǎng)絡(luò)請(qǐng)求,那么你開(kāi)發(fā)的應(yīng)用軟件就是一具沒(méi)有靈魂的枯骨。本文主要為大家介紹的是Android的網(wǎng)絡(luò)請(qǐng)求,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-11-11

Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果

Android編程解析XML文件的方法詳解【基于XmlPullParser】

Android開(kāi)發(fā)之手勢(shì)檢測(cè)及通過(guò)手勢(shì)實(shí)現(xiàn)翻頁(yè)功能的方法

詳解androidstudio項(xiàng)目上傳到github方法以及步驟

Android自定義view仿IOS開(kāi)關(guān)效果