Android中Bitmap、File与Uri之间的简单记录

简介:

感觉Uri 、File、bitmap 比较混乱,这里进行记载,方便以后查看.下面话不多说了,来一起看看详细的介绍吧

Bitmap、File与Uri

1、将一个文件路径path转换成File

String path ;
File file = new File(path)

2、讲一个Uri转换成一个path

以选择一张图片为例:

String path = FileTools.getRealPathFromUri(content,uri);
//自定义方法在下面
 public static String getRealPathFromUri(Context context, Uri uri) {

 if (null == uri) return null; //传入的Uri为空,结束方法

 final String scheme = uri.getScheme(); //得到Uri的scheme

 String realPath = null;

 if (scheme == null)
  realPath = uri.getPath(); //如果scheme为空
 else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
  realPath = uri.getPath(); //如果得到的scheme以file开头
 } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
  //得到的scheme以content开头
  Cursor cursor = context.getContentResolver().query(uri,
   new String[]{MediaStore.Images.ImageColumns.DATA},
   null, null, null);
  if (null != cursor) {
  if (cursor.moveToFirst()) {
   int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
   if (index > -1) {
   realPath = cursor.getString(index);
   }
  }
  cursor.close(); //必须关闭
  }
 }

//经过上面转换得到真实路径之后,判断一下这个路径,如果还是为空的话,说明有可能文件存在于外置sd卡上,不是内置sd卡.
 if (TextUtils.isEmpty(realPath)) {
  if (uri != null) {

  String uriString = uri.toString();
  int index = uriString.lastIndexOf("/"); //匹配 / 在一个路径中最后出现位置

  String imageName = uriString.substring(index);
  //通过得到的最后一个位置,然后截取这个位置后面的字符串, 这样就可以得到文件名字了 

  File storageDir;

  storageDir = Environment.getExternalStoragePublicDirectory(
   Environment.DIRECTORY_PICTURES); //查看外部储存卡公共照片的文件

  File file = new File(storageDir, imageName);
  //自己创建成文件,

  if (file.exists()) {
   realPath = file.getAbsolutePath();
  } else {
//  //那么存储在了外置sd卡的应用缓存file中
   storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
   File file1 = new File(storageDir, imageName);
   realPath = file1.getAbsolutePath();
  }
  }
 }
 return realPath;

 比如我在android 8.0 上运行的时候
 选择照片之后的Uri : content://media/external/images/media/568344
 进行上面方法转换完之后: /storage/emulated/0/com.appben.appche/browser-photos/1550297407488.jpg

 }

3、File 转换成path

String path = file.getPath();
将此抽象路径名转换为一个路径名字符串。所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。

String path = file.getAbsolutePath();
如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串,
该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式分析此路径名。
在 UNIX 系统上,通过根据当前用户目录分析某一相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,
通过由路径名指定的当前驱动器目录(如果有)来分析某一相对路径名,
可使该路径名成为绝对路径名;否则,可以根据当前用户目录来分析它。

getCanonicalPath
规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,
这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。
这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及
将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。
表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式
。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。
同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

下面是参看文章中提到的一个例子

https://blog.csdn.net/qq_39949109/article/details/80609472

File file = new File(".\\test1.txt");
File file = new File("D:\\workspace\\test\\test1.txt");
 System.out.println("-----默认相对路径:取得路径不同------");
 System.out.println(file1.getPath());
 System.out.println(file1.getAbsolutePath());
 System.out.println("-----默认绝对路径:取得路径相同------");
 System.out.println(file2.getPath());
 System.out.println(file2.getAbsolutePath());

结果是:
-----默认相对路径:取得路径不同------
.\test1.txt
D:\workspace\test\.\test1.txt
-----默认绝对路径:取得路径相同------
D:\workspace\test\test1.txt
D:\workspace\test\test1.txt

 File file = new File("..\\src\\test1.txt");
 System.out.println(file.getAbsolutePath());
 System.out.println(file.getCanonicalPath());
//得到的结果
D:\workspace\test\..\src\test1.txt
D:\workspace\src\test1.txt

4、URI 与Uri的区别

URI 是java.net的子类

Uri 是android.net的子类,Uri不能被实例化

5、URI 转换成 File

File file = null;
try{
 file = new File(new URI(uri.toString()));
}catch(URISyntaxException e){
 e.printStackTrace();
}

6、File 转换成URI

URI uri = file.toURI();

7、Path 转换成Uri

Uri uri = Uri.parse(path);

8、图片的Uri转Bitmap

Bitmap bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))

9、File 转到bitmap

Bitmap bitmap = BitmapFactory.decodeFile(file.getPath); //这个file要是真实路径创建的file

10、bitmap 转 file,可以理解为将bitmap进行保存.

//自己创建想要保存的文件的文件对象
BuffferedOutPutStream bos =
new BufferedOutputStream(new FileOutputStream(file));
bos.flush;
bos.close;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android截取视频帧并转化为Bitmap示例

    MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

  • android实现Uri获取真实路径转换成File的方法

    本文实例讲述了android实现Uri获取真实路径转换成File的方法.分享给大家供大家参考.具体实现方法如下: Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = managedQuery(uri,proj,null,null,null); int actual_image_column_index = actualimagecursor.g

  • Android Bitmap详细介绍

    复制代码 代码如下: package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import com.testbitmapscale.R.drawable; im

  • android bitmap compress(图片压缩)代码

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片.有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小.减少图片的大小有两种方法,1. 照小图片: 2. 压缩大图片. 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些: 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍

  • Android Activity之间传递图片(Bitmap)的方法

    在Android开发中:Activity之间传递参数是常见的事:如果我们要在Activity之间传递图片:1.MainActivity中包括一个ImageView:当我们点击ImageView时:把图片传递给另外一个Activity MainActivity的主要代码: 复制代码 代码如下: Intent intent=new Intent(MainActivity.this,TranActivity.class);            intent.putExtra("bitmap"

  • android保存Bitmap图片到指定文件夹示例

    复制代码 代码如下: /** 保存方法 */ public void saveBitmap() { Log.e(TAG, "保存图片"); File f = new File("/sdcard/namecard/", picName); if (f.exists()) { f.delete(); } try { FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFor

  • 数据结构之位图(bitmap)详解

    1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现方法及其应用场景. 2. 位图实现 (1)自己实现 在位图中,每个元素为"0"或"1",表示其对应的元素不存在或者存在. 复制代码 代码如下: #define INT_BITS sizeof(int)   #define SHIFT 5 // 2^5=32   #define MASK 0x1f // 2^5=32   #define MAX 1024*10

  • Android中Bitmap、File与Uri之间的简单记录

    简介: 感觉Uri .File.bitmap 比较混乱,这里进行记载,方便以后查看.下面话不多说了,来一起看看详细的介绍吧 Bitmap.File与Uri 1.将一个文件路径path转换成File String path ; File file = new File(path) 2.讲一个Uri转换成一个path 以选择一张图片为例: String path = FileTools.getRealPathFromUri(content,uri); //自定义方法在下面 public static

  • Android中Bitmap用法实例分析

    本文实例讲述了Android中Bitmap用法.分享给大家供大家参考,具体如下: 一般在android程序中把图片文件放在res/drawable目录下就可以通过R.drawable.id来使用,但在存储卡中的图片怎样引用呢?下面通过实现这个功能来介绍Bitmap的用法. 程序如下: import java.io.File; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.B

  • android中Bitmap用法(显示,保存,缩放,旋转)实例分析

    本文实例讲述了android中Bitmap用法.分享给大家供大家参考.具体如下: 在Android SDK中可以支持的图片格式如下:png , jpg , gif和bmp. 1.Bitmap的创建 借助于BitmapFactory. 1)资源中的图片 使用BitmapFactory获取位图 复制代码 代码如下: Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.testImg); 或者是: Reso

  • Android 中自定义ContentProvider与ContentObserver的使用简单实例

    Android 中自定义ContentProvider与ContentObserver的使用简单实例 示例说明: 该示例中一共包含两个工程.其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver监听自定义ContentProvider的数据变化 以下代码为工程TestContentProvider ContentProviderTest如下: package cn.testcontentp

  • Android中WebView的基本配置与填坑记录大全

    前言 在应用程序开发过程中,经常会采用webview来展现某些界面,这样就可以不受发布版本控制,实时更新,遇到问题可以快速修复. 但是在Android开发中,由于Android版本分化严重,每一个版本针对webview都有部分更改,因此在开发过程中会遇到各种各样的坑,下面这篇就来给大家介绍关于Android中WebView的基本配置与填坑记录,话不多说了,来一起看看详细的介绍吧. 基本配置 // 硬件加速 getActivity().getWindow().setFlags( WindowMan

  • Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法

    Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中的Object要实现Parcelable接口.下面我们以一个完整的例子来说明. 1.新建一个Android的工程,其中该工程的目录结构如下图: 2. 修改main.xml布局文件.布局文件的源码如下

  • Android中Bitmap常见的一些操作:缩放、裁剪、旋转和偏移

    前言 Bitmap相信对各位Android开发者们来说都不陌生,用它可以获取图片信息,进行图片剪切.平移.旋转.缩放等操作,并可以指定格式保存图片文件.本文将对它的一些常见操作进行总结,下面话不多说了,来一起看看详细的介绍吧 Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移 很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitmap显示出来. matrix里有一个3x3的矩阵,用于图像处理: MSCALE_X M

  • Android把Bitmap保存为PNG图像文件的简单代码

    下面一段简单的代码给大家介绍了Android把Bitmap保存为PNG图像文件的方法,具体代码如下所示: public static void saveBitmapAsPng(Bitmap bmp,File f) { try { FileOutputStream out = new FileOutputStream(f); bmp.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); } catch (F

  • android中Bitmap的放大和缩小实例代码

    复制代码 代码如下: /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return

  • Android中使用GridView和ImageViewSwitcher实现电子相册简单功能实例

    我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 实现Activity之间的跳转以及照片标记位置的传递需要用到intent,并分别使用putExtra以及getExtra,传入和获取照片的标记位置. (关于intent,后期会有专门博文介绍具体使用,请大家持续关注哦) 下面我们开始功能的实现: 第一步:Layout中建立首页GridView布局grid_layout.xml文

随机推荐