Bitmap 获取InputStream
时间: 2023-06-24 18:03:19 浏览: 135
你可以使用 `Bitmap.compress()` 方法将 `Bitmap` 对象压缩成一个输出流,然后使用 `ByteArrayOutputStream` 将输出流转换为字节数组,最后使用 `ByteArrayInputStream` 将字节数组转换为输入流。下面是一个示例代码:
```java
Bitmap bitmap = ...; // 获取 Bitmap 对象
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
```
在这个示例代码中,我们将 `Bitmap` 对象压缩成 PNG 格式的图像,压缩质量为 100,然后将输出流转换为字节数组,并使用字节数组创建一个 `ByteArrayInputStream` 对象作为输入流。你可以根据需要修改压缩格式和压缩质量参数。
相关问题
Bitmap 从路径获取一张图片
在Android中,你可以使用`BitmapFactory`的静态方法`decodeFile()`或`decodeStream()`来从文件路径加载图片。这里是一个示例,展示如何从给定路径加载图片生成`Bitmap`对象:
```java
// 图片路径
String imagePath = "file:///storage/emulated/0/DCIM/Camera/your_image.jpg"; // 这里填写具体的图片路径
try {
// 通过File对象创建一个输入流
FileInputStream fis = new FileInputStream(new File(imagePath));
// 使用BitmapFactory解码这个输入流,返回Bitmap对象
Bitmap bitmap = BitmapFactory.decodeStream(fis);
// 关闭输入流,防止资源泄露
fis.close();
// 对位图进行进一步操作,比如设置大小、旋转等
} catch (FileNotFoundException e) {
e.printStackTrace(); // 处理文件未找到异常
}
```
如果路径是网络图片,可以先尝试转换为本地临时文件再加载:
```java
Uri uri = Uri.parse("http://example.com/image.jpg");
InputStream in = context.getContentResolver().openInputStream(uri);
// 照上面的方式创建和解析Bitmap
```
请完善这段代码InputStream inputStream = getContentResolver().openInputStream(imageUri); // 设置 BitmapFactory.Options 对象 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 只解码图片边界,不加载图片 BitmapFactory.decodeStream(inputStream, null, options); inputStream.close(); // 计算采样率 final int maxWidth = 1024; // 假设最大宽度为 1024 像素 int width = options.outWidth; int height = options.outHeight; int sampleSize = 1; while (width > maxWidth) { width /= 2; height /= 2; sampleSize *= 2; } // 设置 BitmapFactory.Options 对象 options = new BitmapFactory.Options(); options.inSampleSize = sampleSize; // 设置采样率 inputStream = getContentResolver().openInputStream(imageUri); Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options); // 压缩图片 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); byte[] bytes = baos.toByteArray(); String imageString= Base64.encodeToString(bytes, Base64.DEFAULT); inputStream.close();
这段代码用于将指定 URI 的图片进行压缩,并将压缩后的图片数据转化为 Base64 编码的字符串。完整代码如下:
```java
try {
// 获取图片输入流
InputStream inputStream = getContentResolver().openInputStream(imageUri);
// 设置 BitmapFactory.Options 对象
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 只解码图片边界,不加载图片
BitmapFactory.decodeStream(inputStream, null, options);
inputStream.close();
// 计算采样率
final int maxWidth = 1024; // 假设最大宽度为 1024 像素
int width = options.outWidth;
int height = options.outHeight;
int sampleSize = 1;
while (width > maxWidth) {
width /= 2;
height /= 2;
sampleSize *= 2;
}
// 设置 BitmapFactory.Options 对象
options = new BitmapFactory.Options();
options.inSampleSize = sampleSize; // 设置采样率
inputStream = getContentResolver().openInputStream(imageUri);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
// 压缩图片
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
byte[] bytes = baos.toByteArray();
String imageString = Base64.encodeToString(bytes, Base64.DEFAULT);
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
```
该代码主要分为以下几个步骤:
1. 使用 `getContentResolver().openInputStream(imageUri)` 方法获取指定 URI 的图片的输入流。
2. 设置 `BitmapFactory.Options` 对象,并调用 `BitmapFactory.decodeStream` 方法进行图片解码,以获取图片的宽度和高度。
3. 根据图片的宽度和高度计算采样率,以便后续进行图片压缩。
4. 重新设置 `BitmapFactory.Options` 对象,设置采样率,并调用 `BitmapFactory.decodeStream` 方法进行图片解码,以获取压缩后的 Bitmap 对象。
5. 将 Bitmap 对象进行压缩,并将压缩后的图片数据转化为 Base64 编码的字符串。
阅读全文
相关推荐














