圖片獲取保存研叫,使用封裝的相冊

1.我實(shí)現(xiàn)的效果

a:從相冊選擇圖片
b:圖片裁剪
c:保存圖片到本地
d:再次進(jìn)入顯示圖片

2.使用到的依賴

compile 'com.jph.takephoto:takephoto_library:4.0.3'

該依賴的github地址:https://github.com/crazycodeboy/TakePhoto

3.該依賴的示例,寫的挺詳細(xì),

one.jpg

其中MainActivity是選擇fragment還是Activity.我這里選擇的是Activity,其中SimpleActivity是拿到圖片的,只不過示例是在ResultActivity里面展示的暑塑。而對圖片的壓縮裁剪等都是在CustomHelper里面進(jìn)行操作的。這里提供了壓縮裁剪工具等的選擇锅必,而我在項(xiàng)目中是寫死的事格,因?yàn)槲也恍枰x擇。

4.在以上基礎(chǔ)上搞隐,我進(jìn)行了修改驹愚。

a. 新建PhotoHelper類,用于獲得圖片的處理方式劣纲。

public class PhotoHelper {
    private View rootView;


    public PhotoHelper(View rootView) {
        this.rootView = rootView;
    }

    public static PhotoHelper of(View rootView,Context context){
        return new PhotoHelper(rootView);
    }

    public void onClick(View view, TakePhoto photo){
        File file=new File(Environment.getExternalStorageDirectory(),
                "/temp"+ System.currentTimeMillis()+".jpg");

        if (!file.getParentFile().exists())file.getParentFile().mkdirs();
        Uri imageUri=Uri.fromFile(file);

        configCompress(photo);
        configTakePhotoOption(photo);
        photo.onPickFromGalleryWithCrop(imageUri,getCropOptions());
    }
//裁剪圖片屬性
    private CropOptions getCropOptions() {
        CropOptions.Builder builder=new CropOptions.Builder();
        builder.setAspectX(800).setAspectY(800);//裁剪時(shí)的尺寸比例
        builder.setWithOwnCrop(true);//s使用第三方還是takephoto自帶的裁剪工具
        return builder.create();
    }
    
//配置圖片屬性
    private void configTakePhotoOption(TakePhoto photo) {
        TakePhotoOptions.Builder builder=new TakePhotoOptions.Builder();
        builder.setWithOwnGallery(true);//使用自帶相冊
        builder.setCorrectImage(false);//糾正旋轉(zhuǎn)角度
        photo.setTakePhotoOptions(builder.create());
    }
    
//    配置壓縮
    private void configCompress(TakePhoto takePhoto){
        CompressConfig config=new CompressConfig.Builder()
                .setMaxSize(102400)//大小不超過100k
                .setMaxPixel(800)//最大像素800
                .enableReserveRaw(true)//是否壓縮
                .create();
        takePhoto.onEnableCompress(config,true);//這個trued代表顯示壓縮進(jìn)度條
    }
}

在onClick方法中逢捺,調(diào)用配置的各種屬性。

b. MainActivity用于展示圖片癞季。首先MainActivity要繼承TakePhotoActivity劫瞳,并重寫TakePhotoActivity里面的幾個方法。

public class MainActivity  extends TakePhotoActivity {
    private static final String TAG = "MainActivity";
    ImageView img;
    Button button;
    String path;
    Bitmap bitmap;
    PhotoHelper photoHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View contentView= LayoutInflater.from(this).inflate(R.layout.activity_main,null);
        setContentView(contentView);

        photoHelper=PhotoHelper.of(contentView,this);

        button= (Button) contentView.findViewById(R.id.btn);
        img= (ImageView) contentView.findViewById(R.id.img);

        if (MyUtils.getBitmap(this)!=null){
            img.setImageBitmap(MyUtils.getBitmap(this));
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//這步由于封裝就直接進(jìn)入選擇圖片界面了绷柒。
                photoHelper.onClick(view,getTakePhoto());
            }
        });
    }

    @Override
    public void takeCancel() {
        super.takeCancel();
    }

    @Override
    public void takeFail(TResult result, String msg) {
        super.takeFail(result, msg);
    }

    @Override
    public void takeSuccess(TResult result) {
        super.takeSuccess(result);
        showImg(result.getImages());
    }

    private void showImg(final ArrayList<TImage> images) {

            Log.e(TAG, "showImg: "+images.get(images.size() - 1).getCompressPath());
            path=images.get(images.size() - 1).getCompressPath();

            Picasso.with(this).load(new File(path))
                    .into(img);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        bitmap = Picasso.with(getApplicationContext())
                                .load(new File(path))
                                .resize(MyUtils.dpToPx(getApplicationContext(),200),MyUtils.dpToPx(getApplicationContext(),200))
                                .transform(new CircleTransform())
                                .get();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (bitmap!=null){
                        Log.e(TAG, "run: "+"bitmap不為空志于,進(jìn)行保存" );
                        MyUtils.savaImage(getApplication(),bitmap);
                    }
                }
            }).start();
    }
}

這里面關(guān)鍵的地方
一個是在按鈕的監(jiān)聽事件里面調(diào)用之前圖片處理方式的配置,
一個是takeSuccess方法里面調(diào)用展示圖片的方法废睦。
本來使用picasso伺绽,可以直接展示圖片的,但為了能下次進(jìn)入可以直接顯示圖片,我使用picasso將圖片地址轉(zhuǎn)換成bitmap奈应,并保存在sd卡中澜掩。

c. 這是保存圖片以及獲取圖片的一個工具類

public class MyUtils {
    private static final String TAG = "MyUtils";
    public static String fileDir;
    public  static File  file;
    
//    根據(jù)filePath獲得bitmap
    public static Bitmap getBitmap(Context c){
        String filePath=c.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
                .getAbsolutePath()+ File.separator+"head.jpg";
        Log.e(TAG, "getBitmap: "+filePath );
        Bitmap bitmap= BitmapFactory.decodeFile(filePath);
        return bitmap;
    }
    
    public static int dpToPx(Context context, int dp) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
    
//  保存圖片  
    public static void savaImage(Context c,Bitmap bitmap) {
        fileDir=c.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath();
        Log.e(TAG, "savaImage: "+fileDir);
        file= new File(fileDir,"head.jpg");
        Log.e(TAG, "savaImage: "+file.toString() );
        if (file.exists()){
            file.delete();
        }
        try {
            FileOutputStream out=new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG,100,out);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

d.這是一個使用picasso把圖片變圓形的方法。

public class CircleTransform implements Transformation {

    @Override
    public Bitmap transform(Bitmap source) {
        int size = Math.min(source.getWidth(), source.getHeight());

        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }

        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap,
                BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);

        squaredBitmap.recycle();
        return bitmap;
    }

    @Override
    public String key() {
        return "circle";
    }
}

5.總結(jié)
安卓手機(jī)具有多樣化的圖片裁剪方式和獲取圖片的方法杖挣,很難做到使用系統(tǒng)自帶的方法完美適配各種手機(jī)输硝。于是使用封裝的相冊便是一個很好的選擇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末程梦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橘荠,更是在濱河造成了極大的恐慌屿附,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥童,死亡現(xiàn)場離奇詭異挺份,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贮懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門匀泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朵你,你說我怎么就攤上這事各聘。” “怎么了抡医?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵躲因,是天一觀的道長。 經(jīng)常有香客問我忌傻,道長大脉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任水孩,我火速辦了婚禮镰矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俘种。我一直安慰自己秤标,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布宙刘。 她就那樣靜靜地躺著抛杨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荐类。 梳的紋絲不亂的頭發(fā)上怖现,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼屈嗤。 笑死潘拨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饶号。 我是一名探鬼主播铁追,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茫船!你這毒婦竟也來了琅束?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤算谈,失蹤者是張志新(化名)和其女友劉穎涩禀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然眼,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艾船,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了高每。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屿岂。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲸匿,靈堂內(nèi)的尸體忽然破棺而出爷怀,到底是詐尸還是另有隱情,我是刑警寧澤带欢,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布霉撵,位于F島的核電站,受9級特大地震影響洪囤,放射性物質(zhì)發(fā)生泄漏徒坡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一瘤缩、第九天 我趴在偏房一處隱蔽的房頂上張望喇完。 院中可真熱鬧,春花似錦剥啤、人聲如沸锦溪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻诊。三九已至,卻和暖如春牺丙,著一層夾襖步出監(jiān)牢的瞬間则涯,已是汗流浹背复局。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粟判,地道東北人亿昏。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像档礁,于是被迫代替她去往敵國和親角钩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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