Android圖片裁剪庫——cropper使用,完美解決圖片填充不滿布局問題

前些時間請了一個月假,遠程辦公,期間項目主要做圖片裁剪,腦子裏第一反應就是github上開源裁剪庫,試了排名的前幾個,其中不是UI定製度太低就是裁剪效果不怎麼樣。當然你也可以直接intent一下系統的裁剪,可是這樣的話,裁剪就完全由系統控制,UI無法定製,甚至連裁剪框大小都不可控,順便吐槽一下只有華爲手機的系統裁剪設置爲正方形後居然是個圓,這特立獨行,也是醉的死死的。


第一次先試用的是SimpleCropView。
github原文地址:https://github.com/IsseiAoki/SimpleCropView
值得肯定的是,這個裁剪庫的UI定製度高的真是讓人佩服的五體投地,所以最開始的時候最先想到它。然而這個庫有一個致命的缺陷,裁剪效率太慢,三星手機3M圖片可以裁剪20秒,而華爲小米的部分機型直接能裁剪兩分鐘,這也無數次讓我們的QA誤認爲應用卡死,苦了她每次給我計算裁剪時間。


試了幾個其他的裁剪庫後,最後還是選擇了cropper。
原文地址:https://github.com/edmodo/cropper
這是一個挺老的裁剪庫,UI定製度也不高,唯一的優點就是穩定,效率快,而且裁剪出的圖片返回的是Bitmap格式,這就讓其後的操作實現起來更加方便。具體的使用方法就參照其Wiki,本文主要重點在cropper使用中遇到的一些問題。

第一個問題,在集成完cropper後,你會發現有些圖片在顯示的時,會出現填充不滿布局的情況。
造成這種情況的原因也很簡單,bitmap圖片也是有高度寬度的,如果bitmap的高度寬度都小於CropImageView的寬高,這樣就會導致圖片顯示無法填充滿屏幕。這也跟cropper的內部處理機制有關,我還做不到去更改它內部源碼,如某個大神做到了,還請告知,先謝過。

解決方案:放大bitmap至屏幕大小,這是一個很討巧的方法,不過很簡單也很實用。

public Bitmap getBitmap(Bitmap bitmap) {
        WindowManager wm = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
        //先獲取屏幕寬高
        int width = wm.getDefaultDisplay().getWidth();
        int height = wm.getDefaultDisplay().getHeight();

        float scaleWidth = 1, scaleHeight = 1;
        if (bitmap.getWidth() < width) {
        //強轉爲float類型,
            scaleWidth = (float)width / (float)bitmap.getWidth();
        }

        if (bitmap.getHeight() < height) {
            scaleHeight = (float)height / (float)bitmap.getHeight();
        }

        if (scaleWidth > scaleHeight)
            scaleHeight = scaleWidth;
        else
            scaleWidth = scaleHeight;

        Matrix matrix = new Matrix();
        //根據屏幕大小選擇bitmap放大比例。
        matrix.postScale(scaleWidth, scaleHeight);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight()
                , matrix, true);
        return bitmap;
    }

嗯,代碼實現起來也算簡單。

第二個問題:沒法設置裁剪框的最小寬度高度。
參考鏈接:https://github.com/edmodo/cropper/issues/118

    ViewGroup.LayoutParams params = cropImageView.getLayoutParams();
    params.width = 500;
    params.height = 500;
    cropImageView.setLayoutParams(params);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章