最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程圖片操作類定義與用法示例【拍照,相冊選圖及裁剪】

 更新時間:2018年02月09日 10:06:35   作者:遲做總比不做強  
這篇文章主要介紹了Android編程圖片操作類定義與用法,涉及Android拍照,相冊選圖及裁剪等圖片操作功能及權(quán)限控制相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Android編程圖片操作類定義與用法。分享給大家供大家參考,具體如下:

主界面類:拍照及選擇相冊圖片

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
/**
 * Android中圖片操作(拍照,相冊圖片選擇及圖片裁剪)
 * 作者:ldm
 * 時間:20162016/7/11 09:09
 */
public class ImageTestActivity extends Activity implements View.OnClickListener {
  //拍照
  private Button take_photo;
  //從相冊中選擇圖片
  private Button local_pic;
  //圖片展示
  private ImageView upload_image;
  //定義操作常量
  private final static int TAKE_PHOTO_REQUEST = 1;
  private final static int LOCAL_PICS_REQUEST = 2;
  private final static int UPLOAD_PIC_REQUEST = 3;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_image_test);
    //初始化控件及監(jiān)聽事件
    initViews();
  }
  private void initViews() {
    this.upload_image = (ImageView) findViewById(R.id.upload_image);
    this.take_photo = (Button) findViewById(R.id.take_photo);
    this.local_pic = (Button) findViewById(R.id.local_pics);
    this.take_photo.setOnClickListener(this);
    this.local_pic.setOnClickListener(this);
  }
  @Override
  public void onClick(View view) {
    if (view.getId() == R.id.take_photo) {//拍照
      //調(diào)用系統(tǒng)拍照In
      Intent photoIn = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      startActivityForResult(photoIn, TAKE_PHOTO_REQUEST);
    } else if (view.getId() == R.id.local_pics) {//從相冊選擇
      Intent picsIn = new Intent(Intent.ACTION_GET_CONTENT);
      picsIn.setType("image/*");//設(shè)置選擇的數(shù)據(jù)類型為圖片類型
      startActivityForResult(picsIn, LOCAL_PICS_REQUEST);
    }
  }
  //拍照或選擇相冊后,數(shù)據(jù)在這里處理
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (null == data) {
      return;
    }
    switch (requestCode) {
      case TAKE_PHOTO_REQUEST:
        Bundle bundle = data.getExtras();//獲取到圖片數(shù)據(jù)
        if (null != bundle) {
          Bitmap bm = bundle.getParcelable("data");
          //把圖片展示在ImView上
//          upload_image.setImageBitmap(bm);
          //對圖片剪
          Uri uri = ImageUtils.saveBitmapToSdCard(bm);
          startImageCrop(uri);
        }
        break;
      case LOCAL_PICS_REQUEST:
        Uri uri = data.getData();//從圖片的Uri是以cotent://格式開頭的
        //獲取到圖片
        Bitmap bm = ImageUtils.uri2Bitmap(ImageTestActivity.this, uri);
        //把圖片展示在ImView上
//        upload_image.setImageBitmap(bm);
        //把拍照的圖片保存到本地并轉(zhuǎn)換成文件格式的Uri
        Uri fileUri = ImageUtils.saveBitmapToSdCard(bm);
        //對圖片剪
        startImageCrop(fileUri);
        break;
      case UPLOAD_PIC_REQUEST:
        //把裁剪后的圖片展示出來
        Bundle b = data.getExtras();
        Bitmap bitmap = b.getParcelable("data");
        //圖片展示出來
        upload_image.setImageBitmap(bitmap);
        break;
    }
  }
  /**
   * @param
   * @description 圖片裁剪
   * @author ldm
   * @time 2016/7/11 10:07
   */
  private void startImageCrop(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");//設(shè)置Uri及類型
    intent.putExtra("crop", "true");//
    intent.putExtra("aspectX", 2);//X方向上的比例
    intent.putExtra("aspectY", 1);//Y方向上的比例
    intent.putExtra("outputX", 200);//裁剪區(qū)的X方向?qū)?
    intent.putExtra("outputY", 100);//裁剪區(qū)的Y方向?qū)?
    intent.putExtra("scale", true);//是否保留比例
    intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
    intent.putExtra("return-data", true);//是否將數(shù)據(jù)保留在Bitmap中返回dataParcelable相應(yīng)的Bitmap數(shù)據(jù)
    startActivityForResult(intent, UPLOAD_PIC_REQUEST);
  }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <Button
    android:id="@+id/take_photo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="拍照上傳" />
  <Button
    android:id="@+id/local_pics"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="本地圖庫上傳" />
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="圖片信息展示"
    android:layout_marginLeft="10dp"
    android:textSize="16sp"/>
  <ImageView
    android:id="@+id/upload_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"/>
</LinearLayout>

圖片操作工具類

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.text.format.DateFormat;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Locale;
/**
 * description:從圖片中獲取到的Uri是以content://開頭的,從U中找到對應(yīng)圖片
 * 作者:ldm
 * 間:20162016/7/11 09:47
 */
public class ImageUtils {
  public static Bitmap uri2Bitmap(Context mContext, Uri uri) {
    InputStream in = null;
    try {
      in = mContext.getContentResolver().openInputStream(uri);
      //從輸入流中獲取到圖片
      Bitmap bm = BitmapFactory.decodeStream(in);
      in.close();
      return bm;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  /**
   * @param
   * @description 保存圖片到手機SD卡, 并返回圖片對應(yīng)的文件i
   * @author ldm
   * @time 2016/7/11 9:55
   */
  public static Uri saveBitmapToSdCard(Bitmap bm) {
    //自定義圖片名稱
    String name = DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".png";
    //定義圖片存放的位置
    File tempFile = new File("/sdcard/Image/");
    if (!tempFile.exists()) {
      tempFile.mkdir();
    }
    String fileName = "/sdcard/Image/" + name;
    File pic = new File(fileName);
    try {
      FileOutputStream os = new FileOutputStream(pic);
      //對圖片進行壓縮
      bm.compress(Bitmap.CompressFormat.PNG, 100, os);
      os.flush();
      os.close();
      return Uri.fromFile(pic);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
}

最后不要忘記在AndroidManifest.xml中添加 相應(yīng)權(quán)限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

注:更多關(guān)于Android權(quán)限控制的說明可點擊此處查看Android權(quán)限操作說明

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • 在Android中 獲取正在運行的Service 實例

    在Android中 獲取正在運行的Service 實例

    本篇文章小編為大家介紹,在Android中 獲取正在運行的Service 實例。需要的朋友參考下
    2013-04-04
  • 解析Android開發(fā)優(yōu)化之:對界面UI的優(yōu)化詳解(二)

    解析Android開發(fā)優(yōu)化之:對界面UI的優(yōu)化詳解(二)

    在一個應(yīng)用程序中,一般都會存在多個Activity,每個Activity對應(yīng)著一個UI布局文件。一般來說,為了保持不同窗口之間的風(fēng)格統(tǒng)一,在這些UI布局文件中,幾乎肯定會用到很多相同的布局
    2013-05-05
  • Android實現(xiàn)斷點多線程下載

    Android實現(xiàn)斷點多線程下載

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)斷點多線程下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 深入Android MediaPlayer的使用方法詳解

    深入Android MediaPlayer的使用方法詳解

    本篇文章是對Android中MediaPlayer的使用方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Android自定義實現(xiàn)羅盤視圖詳解

    Android自定義實現(xiàn)羅盤視圖詳解

    在開發(fā)Android應(yīng)用時,自定義視圖是一個非常重要的技能,本文將介紹如何創(chuàng)建一個自定義的羅盤視圖,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Android Fragment+FragmentTabHost組件實現(xiàn)常見主頁面(仿微信新浪)

    Android Fragment+FragmentTabHost組件實現(xiàn)常見主頁面(仿微信新浪)

    本文主要介紹Fragment+FragmentTabHost組件實現(xiàn)常見主頁面,這里整理了詳細(xì)資料及簡單示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Android BottomNavigationBar底部導(dǎo)航的使用方法

    Android BottomNavigationBar底部導(dǎo)航的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android BottomNavigationBar底部導(dǎo)航的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android實現(xiàn)幀動畫的兩種方式

    Android實現(xiàn)幀動畫的兩種方式

    幀動畫(Frame?Animation)是一種在一定時間內(nèi)按順序播放一系列圖像幀(每一幀都是一個單獨的圖像),從而產(chǎn)生連續(xù)運動或變化的動畫效果,本文給大家介紹了Android實現(xiàn)幀動畫的兩種方式,需要的朋友可以參考下
    2024-02-02
  • Android中驗證碼倒計時的簡單實現(xiàn)方法示例

    Android中驗證碼倒計時的簡單實現(xiàn)方法示例

    最近開發(fā)中在注冊獲取驗證碼時候需要一個倒計時按鈕,找了相關(guān)的資料終于實現(xiàn)了,所以現(xiàn)在分享給大家,下面這篇文章主要給大家介紹了關(guān)于Android中驗證碼倒計時簡單實現(xiàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-06-06
  • 一篇文章就能了解Rxjava

    一篇文章就能了解Rxjava

    最近偶然接觸到了rxjava。關(guān)于rxjava,褒貶不一,有人說好用,有人說難用,不過它到底是什么?它有什么用?接下來,本文通過部分代碼及分析,向大家介紹rxjava及其相關(guān)內(nèi)容。
    2017-10-10

最新評論

洛南县| 建昌县| 贵州省| 凤城市| 金坛市| 洪雅县| 平罗县| 平和县| 玉环县| 博白县| 民乐县| 新营市| 壶关县| 云阳县| 称多县| 濮阳市| 林甸县| 康乐县| 抚顺县| 马公市| 右玉县| 阳高县| 台州市| 繁昌县| 龙州县| 屏山县| 海城市| 合肥市| 通海县| 武鸣县| 丰原市| 桂东县| 靖江市| 莱州市| 宁远县| 石城县| 蒙山县| 石棉县| 林芝县| 台前县| 西城区|