Android圖片剪裁之調(diào)用系統(tǒng)剪裁

參考:

一. 原理

  • 通過(guò)Intent打開系統(tǒng)自帶的剪裁Activity辖试,通過(guò)Intent設(shè)置Extra參數(shù),進(jìn)行剪裁參數(shù)的設(shè)定。剪裁結(jié)果的縮略圖會(huì)保存在返回的data中贤徒,而大圖要通過(guò)Uri進(jìn)行保存(其實(shí)就是保存到自己建的文件里面)懒豹。

二. 剪裁時(shí)候可以設(shè)置的參數(shù)及簡(jiǎn)介

這是一張偷來(lái)的圖片

三. 返回縮略圖的使用步驟

  1. 獲取要剪裁的圖片(可以通過(guò)相冊(cè)選擇,也可以通過(guò)相機(jī)拍照)PS:此處演示從相冊(cè)選擇(就是從相冊(cè)選取圖片袜蚕,然后返回一個(gè)圖片路徑的Uri)
    //打開相冊(cè)
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, REQ_PIC);
    
    //onActivityResult()里面獲取選擇的圖片
    if (requestCode == REQ_PIC) {
        mImageUri = data.getData();
        crop();//獲取到之后開始剪裁
    }
    
  2. 設(shè)置剪裁Intent及參數(shù)
    private void cropAndThumbnail(){
         Intent intent = new Intent("com.android.camera.action.CROP");
         intent.setDataAndType(mImageUri, "image/*");//設(shè)置要縮放的圖片Uri和類型
         intent.putExtra("aspectX", 768);//寬度比
         intent.putExtra("aspectY", 1024);//高度比
         intent.putExtra("outputX", 768);//輸出圖片的寬度
         intent.putExtra("outputY", 1024);//輸出圖片的高度
         intent.putExtra("scale", true);//縮放
         intent.putExtra("return-data", false);//當(dāng)為true的時(shí)候就返回縮略圖八毯,false就不返回,需要通過(guò)Uri
         intent.putExtra("noFaceDetection", false);//前置攝像頭
         
         startActivityForResult(intent, REQ_CROP);//打開剪裁Activity
    }
    
  3. startActivityForResult打開剪裁Activity
    • 代碼即為上面代碼最后一句
  4. onActivityResult回調(diào)里面進(jìn)行數(shù)據(jù)處理(縮略圖保存在返回的Intent的Bundle里面焙蚓,然后通過(guò)data鍵可以取出)
    if (requestCode == REQ_CROP) {
         /*縮略圖*/
         if(data!=null){
             Bundle bundle = data.getExtras();
             Bitmap bitmap = bundle.getParcelable("data");
             mImageView.setImageBitmap(bitmap);
             Log.i(TAG, "onActivityResult: smallUri "+mSmallUri);
         }
    }
    

四. 返回原圖的使用步驟

原圖太大朝氓,Android不會(huì)保存到內(nèi)存里面去,所以也不會(huì)返回到調(diào)用的Activity中主届,因此需要通過(guò)Uri保存到外部文件中赵哲。

  1. 獲取要剪裁的圖片(可以通過(guò)相冊(cè)選擇,也可以通過(guò)相機(jī)拍照)
    • 代碼同上1
  2. 設(shè)置剪裁Intent及參數(shù)
    private void crop() {
    
         /*新建用于存剪裁后圖片的文件君丁,并轉(zhuǎn)化為Uri*/
         File imageFile = createImageFile();
         mSmallUri = Uri.fromFile(imageFile);
         Log.i(TAG, "crop: " + mSmallUri);
    
         Intent intent = new Intent("com.android.camera.action.CROP");
         intent.setDataAndType(mImageUri, "image/*");
         intent.putExtra("aspectX", 768);
         intent.putExtra("aspectY", 1024);
         intent.putExtra("outputX", 768);
         intent.putExtra("outputY", 1024);
         intent.putExtra("scale", true);
         intent.putExtra("return-data", false);//設(shè)置為不返回縮略圖
         intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//設(shè)置大圖保存到文件
         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//保存的圖片格式
         intent.putExtra("noFaceDetection", false);
         
         startActivityForResult(intent, REQ_CROP);
    }
    
  3. startActivityForResult打開剪裁Activity
    • 代碼即為上面代碼最后一句
  4. onActivityResult回調(diào)里面進(jìn)行數(shù)據(jù)處理(文件對(duì)應(yīng)的Uri)
    try {
         if (mSmallUri != null) {
             Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri));
             mImageView.setImageBitmap(bitmap);
         } else {
             Log.i(TAG, "onActivityResult: Uri is null");
         }
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     }
    

五.源碼

public class MainActivity extends AppCompatActivity {

    private Button mButton;
    private static final int REQ_CROP = 873;
    private static final int REQ_PIC = 434;
    private Uri mImageUri;
    private ImageView mImageView;
    private Uri mSmallUri;
    private final String TAG = getClass().getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button);//點(diǎn)擊從相冊(cè)選取照片
        mImageView = findViewById(R.id.imageView);//顯示剪裁后的圖片
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(intent, REQ_PIC);
            }
        });
    }

    private void crop() {

        /*新建用于存剪裁后圖片的文件枫夺,并轉(zhuǎn)化為Uri*/
        File imageFile = createImageFile();
        mSmallUri = Uri.fromFile(imageFile);
        Log.i(TAG, "crop: " + mSmallUri);

        /*File image = new File(getExternalCacheDir() + "/demo.jpg");
        Log.i(TAG, "crop: path " + image.getAbsolutePath());
        mSmallUri = Uri.fromFile(image);*/

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(mImageUri, "image/*");
        intent.putExtra("aspectX", 768);
        intent.putExtra("aspectY", 1024);
        intent.putExtra("outputX", 768);
        intent.putExtra("outputY", 1024);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", false);//設(shè)置為不返回縮略圖
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//設(shè)置大圖保存到文件
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//保存的圖片格式
        intent.putExtra("noFaceDetection", false);

        startActivityForResult(intent, REQ_CROP);
    }

    /*縮略圖*/
    private void cropAndThumbnail() {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(mImageUri, "image/*");//設(shè)置要縮放的圖片Uri和類型
        intent.putExtra("aspectX", 768);//寬度比
        intent.putExtra("aspectY", 1024);//高度比
        intent.putExtra("outputX", 768);//輸出圖片的寬度
        intent.putExtra("outputY", 1024);//輸出圖片的高度
        intent.putExtra("scale", true);//縮放
        intent.putExtra("return-data", false);//當(dāng)為true的時(shí)候就返回縮略圖,false就不返回绘闷,需要通過(guò)Uri
        intent.putExtra("noFaceDetection", false);//前置攝像頭

        startActivityForResult(intent, REQ_CROP);
    }

    /*用時(shí)間創(chuàng)建圖片文件橡庞,防重名*/
    private File createImageFile() {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = null;
        try {
            imageFile = File.createTempFile(imageFileName, ".jpg", storageDir);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return imageFile;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == REQ_PIC) {//選取圖片
            mImageUri = data.getData();
            crop();
        } else if (requestCode == REQ_CROP) {//剪裁
            /*縮略圖*/
            /*if(data!=null){
                Bundle bundle = data.getExtras();
                Bitmap bitmap = bundle.getParcelable("data");
                mImageView.setImageBitmap(bitmap);
                Log.i(TAG, "onActivityResult: smallUri "+mSmallUri);
            }*/
            /*原圖*/
            try {
                if (mSmallUri != null) {
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri));
                    mImageView.setImageBitmap(bitmap);
                } else {
                    Log.i(TAG, "onActivityResult: Uri is null");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市印蔗,隨后出現(xiàn)的幾起案子扒最,更是在濱河造成了極大的恐慌,老刑警劉巖华嘹,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧趣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耙厚,警方通過(guò)查閱死者的電腦和手機(jī)强挫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)薛躬,“玉大人俯渤,你說(shuō)我怎么就攤上這事⌒捅Γ” “怎么了八匠?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵絮爷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我梨树,道長(zhǎng)坑夯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任劝萤,我火速辦了婚禮渊涝,結(jié)果婚禮上慎璧,老公的妹妹穿的比我還像新娘床嫌。我一直安慰自己,他們只是感情好胸私,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布厌处。 她就那樣靜靜地躺著,像睡著了一般岁疼。 火紅的嫁衣襯著肌膚如雪阔涉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天捷绒,我揣著相機(jī)與錄音瑰排,去河邊找鬼。 笑死暖侨,一個(gè)胖子當(dāng)著我的面吹牛椭住,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播字逗,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼京郑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了葫掉?” 一聲冷哼從身側(cè)響起些举,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俭厚,沒想到半個(gè)月后户魏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挪挤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年绪抛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片电禀。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幢码,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尖飞,到底是詐尸還是另有隱情症副,我是刑警寧澤店雅,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站贞铣,受9級(jí)特大地震影響闹啦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕坝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一窍奋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酱畅,春花似錦琳袄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至餐蔬,卻和暖如春碎紊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背樊诺。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工仗考, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人词爬。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓秃嗜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缸夹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痪寻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 先看一下效果圖: (一)頭像裁切、上傳服務(wù)器(效果圖) 一般都是有圓形顯示頭像的虽惭,這里我自定義了一個(gè)ImageVi...
    kingZXY2009閱讀 5,476評(píng)論 5 15
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程橡类,因...
    小菜c閱讀 6,365評(píng)論 0 17
  • 臨近期末,目前在進(jìn)行Android課程設(shè)計(jì)芽唇,對(duì)于我這個(gè)壓根不怎么學(xué)習(xí)的孩子來(lái)說(shuō)顾画,剛開始的完全是懵逼的,后來(lái)花兩天時(shí)...
    站在冰箱上的姑娘閱讀 23,895評(píng)論 5 41
  • 我去你留 兩個(gè)秋匆笤。
    252916c87e6d閱讀 130評(píng)論 0 4
  • 既然你已經(jīng)決定融入我們這個(gè)大家庭研侣,就請(qǐng)你務(wù)必遵守本專題的一些相關(guān)規(guī)定。 這里的文章并不枯燥無(wú)味炮捧,但相信由于你的到來(lái)...
    我的閔先生閱讀 1,360評(píng)論 0 4