android URI转换成Inputstream

ContentResolver resolver = getContentResolver();
InputStream inStream=resolver.openInputStream(Uri.parse("http://www.baidu.com")));
<think> 我们已知引用内容是关于如何通过设置inJustDecodeBounds来获取图片尺寸并进行压缩的,但用户的问题是如何将Uri转换为Bitmap并进行质量压缩。注意,质量压缩和采样率压缩是两种不同的压缩方式。 质量压缩:通常指改变图片的位深和透明度来减小文件大小,通过Bitmap.compress()方法实现,但不会减少图片的像素,所以内存占用不变。 采样率压缩(如引用所述):通过inSampleSize设置缩放比例,减少图片的像素,从而减小内存占用。 用户要求的是质量压缩,但引用提供的是采样率压缩(尺寸压缩)的方法。因此,我们需要结合用户需求,提供将Uri转换为Bitmap后,进行质量压缩的方法。 步骤: 1. 将Uri转换为Bitmap:通过ContentResolver打开输入流,然后使用BitmapFactory.decodeStream()方法。 2. 进行质量压缩:使用Bitmap.compress()方法,可以指定压缩格式(如JPEG)、质量(0-100)和输出流。 注意:质量压缩通常用于将Bitmap写入文件输出流,从而减少存储占用,但内存中的Bitmap对象大小不变。 因此,我们可以这样回答: 在Android中,将Uri转换为Bitmap并进行质量压缩的步骤如下: 1. 通过ContentResolver打开Uri对应的输入流,得到Bitmap对象。 2. 创建一个输出流(例如文件输出流)来保存压缩后的图片。 3. 使用Bitmap的compress方法进行质量压缩。 示例代码: ```java // 1. 将Uri转换为Bitmap ContentResolver contentResolver = context.getContentResolver(); InputStream inputStream = contentResolver.openInputStream(uri); Bitmap originalBitmap = BitmapFactory.decodeStream(inputStream); if (inputStream != null) { inputStream.close(); } // 2. 进行质量压缩(这里以保存到文件为例) // 创建一个文件来保存压缩后的图片,例如在缓存目录 File outputFile = new File(context.getCacheDir(), "compressed_image.jpg"); FileOutputStream outputStream = new FileOutputStream(outputFile); // 压缩质量为80%,格式为JPEG originalBitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream); outputStream.flush(); outputStream.close(); // 注意:原始Bitmap如果不再需要,应该回收 // originalBitmap.recycle(); ``` 但是,上述代码将压缩后的图片保存到了文件。如果用户希望得到压缩后的Bitmap对象,需要注意:质量压缩并不会改变Bitmap对象本身,而是将压缩后的数据写入流中。因此,如果用户需要内存中的Bitmap对象是压缩后的,那么需要重新读取压缩后的文件来生成Bitmap,或者使用其他方法(如矩阵缩放)。但是,通常质量压缩是为了减少存储空间,而内存中的Bitmap大小由像素数决定。 如果用户希望减少内存中的Bitmap大小(即像素数),那么应该使用采样率压缩(即引用中的方法)。因此,我们可以同时提供两种压缩方式,并解释区别。 考虑到用户明确要求质量压缩,我们按照质量压缩的方式回答。 另外,注意处理可能出现的异常(如IOException)以及权限问题。 因此,我们可以这样组织回答: 在Android Java中,将Uri转换为Bitmap并进行质量压缩通常涉及以下步骤: 1. 从Uri获取输入流并解码为Bitmap。 2. 将Bitmap进行质量压缩并输出到文件(或其他输出流)。 注意:质量压缩不会改变Bitmap对象在内存中的大小(即像素数量不变),它只改变存储时的数据量。如果需要减少内存占用,应该结合采样率压缩。 下面是详细的代码示例: ```java try { // 步骤1: 从Uri获取Bitmap ContentResolver contentResolver = getContentResolver(); // 在Activity中 InputStream inputStream = contentResolver.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); if (inputStream != null) { inputStream.close(); } // 步骤2: 质量压缩 // 准备输出流,这里保存到缓存文件 File cacheDir = getCacheDir(); File compressedFile = new File(cacheDir, "compressed.jpg"); FileOutputStream fos = new FileOutputStream(compressedFile); // 压缩质量为80%,格式为JPEG(JPEG格式会忽略透明度,因此如果原图有透明度,会被填充为黑色) boolean success = bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); fos.flush(); fos.close(); // 注意:如果后续需要显示或处理压缩后的图片,可以从文件重新加载Bitmap // Bitmap compressedBitmap = BitmapFactory.decodeFile(compressedFile.getAbsolutePath()); // 回收原始Bitmap以释放内存(如果不再需要) // bitmap.recycle(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ``` 重要提示: - 质量压缩只影响写入文件时的数据大小,不影响内存中Bitmap的大小。 - 如果需要减少内存占用,应该在读取图片时进行采样率压缩(即设置inSampleSize),这样可以避免内存溢出(OOM)。 如果需要同时进行采样率压缩(减少内存占用)和质量压缩(减少存储空间),可以结合使用: 1. 使用采样率压缩从Uri读取一个尺寸较小的Bitmap(参考引用中的方法)。 2. 然后对这个Bitmap进行质量压缩并保存。 这样既减少了内存占用,又减少了存储占用。 由于用户没有明确要求减少内存占用,我们只按照质量压缩的方式提供。但为了全面性,我们可以简要提及采样率压缩。 因此,回答结构如下: 首先,解释质量压缩和采样率压缩的区别。 然后,提供质量压缩的代码。 最后,如果用户需要减少内存占用,可以建议使用采样率压缩。 同时,生成相关问题。 </think>在 Android Java 中将 Uri 转换为 Bitmap 并进行质量压缩的方法如下: ### 转换与压缩步骤 1. **Uri 转 Bitmap** 通过 ContentResolver 打开输入流并解码: ```java ContentResolver resolver = context.getContentResolver(); InputStream inputStream = resolver.openInputStream(uri); Bitmap originalBitmap = BitmapFactory.decodeStream(inputStream); if (inputStream != null) inputStream.close(); ``` 2. **质量压缩** 使用 `compress()` 方法控制输出质量(0-100)并保存到新文件: ```java // 创建输出文件(示例路径) File compressedFile = new File(context.getCacheDir(), "compressed.jpg"); FileOutputStream fos = new FileOutputStream(compressedFile); // 压缩并保存(JPEG格式,质量70%) originalBitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.flush(); fos.close(); // 回收原始Bitmap释放内存 originalBitmap.recycle(); ``` ### 完整示例代码 ```java public File compressImage(Context context, Uri uri) throws IOException { // 1. Uri转Bitmap ContentResolver resolver = context.getContentResolver(); InputStream input = resolver.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(input); if (input != null) input.close(); // 2. 创建压缩文件 File outputFile = new File(context.getCacheDir(), "compressed_" + System.currentTimeMillis() + ".jpg"); FileOutputStream fos = new FileOutputStream(outputFile); // 3. 质量压缩(质量值70%) bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); fos.flush(); fos.close(); bitmap.recycle(); // 释放内存 return outputFile; // 返回压缩后的文件 } ``` ### 关键注意事项 1. **内存管理** - 大图片需先缩放尺寸再压缩(参考 `inSampleSize` 方法[^1]) - 及时调用 `recycle()` 避免内存泄漏 - 使用 `decodeStream` 时关闭 `InputStream` 2. **质量参数** - **JPEG 格式**:质量值 0-100(100=无损,文件最大) - **PNG 格式**:忽略质量参数(始终无损压缩) 3. **性能优化** 批量处理时建议使用 AsyncTask 或 WorkManager 避免主线程阻塞。 > 该方法通过降低位图质量而非像素数量实现压缩,适用于保持原尺寸但减小文件体积的场景(如上传图片)[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值