欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android實(shí)現(xiàn)圖片裁剪的兩種方法

 更新時(shí)間:2021年09月18日 10:59:27   作者:kcl5715305  
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)圖片裁剪的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

兩種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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android保持屏幕常亮

    Android保持屏幕常亮

    本篇文章主要介紹了Android保持屏幕常亮,PowerManager.WakeLock的使用。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果

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

    這篇文章主要介紹了Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果,邏輯非常簡(jiǎn)單,或許繪圖方面更加繁瑣XD 需要的朋友可以參考下
    2016-04-04
  • Android編程解析XML文件的方法詳解【基于XmlPullParser】

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

    這篇文章主要介紹了Android編程解析XML文件的方法,結(jié)合實(shí)例形式分析了Android基于XmlPullParser解析xml文件的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • Android開(kāi)發(fā)之手勢(shì)檢測(cè)及通過(guò)手勢(shì)實(shí)現(xiàn)翻頁(yè)功能的方法

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

    這篇文章主要介紹了Android開(kāi)發(fā)之手勢(shì)檢測(cè)及通過(guò)手勢(shì)實(shí)現(xiàn)翻頁(yè)功能的方法,結(jié)合實(shí)例形式分析了Android GestureDetector類實(shí)現(xiàn)手勢(shì)檢測(cè)功能的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Android10 啟動(dòng)Zygote源碼解析

    Android10 啟動(dòng)Zygote源碼解析

    這篇文章主要為大家介紹了Android 10 啟動(dòng)分析之Zygote篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解androidstudio項(xiàng)目上傳到github方法以及步驟

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

    在使用studio開(kāi)發(fā)的項(xiàng)目過(guò)程中有時(shí)候我們想將項(xiàng)目發(fā)布到github上,studio其實(shí)是自帶這種功能的,那么如何使用呢,下面我們就一起來(lái)了解一下
    2019-01-01
  • Android自定義view仿IOS開(kāi)關(guān)效果

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

    這篇文章主要為大家詳細(xì)介紹了Android自定義view仿IOS開(kāi)關(guān)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 最新評(píng)論