欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程实现调用系统图库与裁剪图片功能

程序员文章站 2024-02-15 08:29:10
本文实例讲述了android编程实现调用系统图库与裁剪图片功能。分享给大家供大家参考,具体如下: 在android开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己...

本文实例讲述了android编程实现调用系统图库与裁剪图片功能。分享给大家供大家参考,具体如下:

在android开发中,调用系统图库和裁剪照片是很常见的需求。相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等。因此,对于一般的需求,建议直接调用系统的功能,简便高效!

首先上效果图:

Android编程实现调用系统图库与裁剪图片功能 Android编程实现调用系统图库与裁剪图片功能 Android编程实现调用系统图库与裁剪图片功能

一、只调用系统图库(不裁剪),返回用户选择的图片。(只支持单选,如需多选则需要自己实现,可参考android编程实现仿qq照片选择器(按相册分类显示,多选添加)源码。)

1.跳转至系统图库页面:

intent i = new intent(intent.action_pick, mediastore.images.media.external_content_uri);
startactivityforresult(i, select_image);

2.在onactivityresult中接收系统图库返回的信息(也就是用户选择的照片)。

@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
    super.onactivityresult(requestcode, resultcode, data);
    if (resultcode != result_ok || data == null) {
      return;
    }
    //select an image
    if (requestcode == select_image) {
      //get image path from uri
      string imagepath = getimagepath(data.getdata());
      return;
    }
}
private string getimagepath(uri selectedimage) {
    string[] filepathcolumn = {mediastore.images.media.data};
    cursor cursor = getcontentresolver().query(selectedimage, filepathcolumn, null, null, null);
    cursor.movetofirst();
    int columnindex = cursor.getcolumnindex(filepathcolumn[0]);
    string imagepath = cursor.getstring(columnindex);
    cursor.close();
    system.out.println("image path:" + imagepath);
    return imagepath;
}

二、跳转至系统图库,选择照片,并裁剪。

1.跳转至系统图库:

//select image via system gallery, crop and save the new image file.
public void selectimageandcrop(view view) {
    //after cropping, the image file will be stored here!
    cachefile = imagecachefolder + file.separator + "cache_" + system.currenttimemillis() + ".jpg";
    intent intent = new intent(intent.action_get_content);
    intent.settype("image/*");
    intent.putextra("crop", "true");
    //width:height
    intent.putextra("aspectx", 1);
    intent.putextra("aspecty", 1);
    intent.putextra("output", uri.fromfile(new file(cachefile)));
    intent.putextra("outputformat", "jpeg");
    startactivityforresult(intent.createchooser(intent, "choose image"), select_image_crop);
}

跳转之前需要传递的数据:

(1)crop:传递一个true,告诉系统需要裁剪。
(2)aspectx和aspecty:裁剪框的宽高比。
(3)output:需要传递一个由文件路径cachefile构建的uri,用户在图库页面选择照片之后会自动进入裁剪页面,裁剪之后图片会被保存在cachefile这个位置。

裁剪完成之后,同样会回调onactivityresult方法(resultcode为result_ok),并且图片会被保存在cachefile这个位置,因此可以直接使用这个文件,例如将其设置为imageview的资源。

@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
    super.onactivityresult(requestcode, resultcode, data);
    if (resultcode != result_ok) {
      return;
    }
    //select an image and crop
    if (requestcode == select_image_crop) {
       //compress the original image to save memory.
      bitmapfactory.options opt = new bitmapfactory.options();
      opt.insamplesize = 4;
      imageview.setimagebitmap(bitmapfactory.decodefile(cachefile, opt));
    }
}

更多关于android相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。