Android 图片转数据流存储优化方法
在Android开发中,将图片转换成数据流的形式保存是一种常见的需求,尤其是在网络传输或存储有限空间时。本文档中的`BitmapUtil`类提供了一个名为`scaleBitmap`的方法,用于处理这一任务。首先,理解如何使用`BitmapFactory.Options`对象对图片进行缩放至关重要。该方法接收两个参数:源图片的路径(`String src`)和目标的最大宽度(`int max`)。为了确保图片不失真,方法首先通过设置`inJustDecodeBounds`属性为`true`来获取原始图片的尺寸信息,然后计算出合适的采样率(`inSampleSize`),使得图片在压缩后能适应指定的最大宽度。 在计算采样率时,如果原图宽度不能整除最大宽度,会调整采样率以确保结果是10的倍数,同时避免因为过小的采样导致图片质量降低。最后,将`inJustDecodeBounds`设为`false`,实际读取并缩放图片。 除了缩放图片,文档还提到了另一个方法`watermarkBitmap`,它用于在图片上添加水印。这个方法接受三个参数:源图片(`Bitmap src`)、水印图片(`Bitmap watermark`)以及水印文本(`String title`)。如果源图片为空,则返回空值。没有详细说明如何添加水印,但可以推测其可能使用了`Canvas`或`Paint`对象,结合TextPaint和StaticLayout来绘制文本,并将水印与源图片合并。 总结起来,本篇文档主要涉及的知识点包括: 1. **BitmapFactory.Options**的使用:用于解码图片时控制质量和大小,如设置`inJustDecodeBounds`和`inSampleSize`。 2. **图片缩放**:通过计算采样率实现不同分辨率设备上的自适应显示,保持图像质量。 3. **图片水印**:处理在图片上添加文字水印的操作,涉及到文本渲染和图形混合技术。 4. **基础类型和工具类**:如`String`, `List`, `ArraysUtils`, 和`Base64`等,用于处理字符串、数组操作和数据编码。 这些功能对于Android开发者来说,能够在项目中灵活处理图片处理需求,提升应用性能和用户体验。
import android.graphics.*;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.Base64;
import com.wondersgroup.common.util.ArraysUtils;
import java.io.*;
import java.util.List;
public class BitmapUtil {
// 获取图片缩小的图片
public static Bitmap scaleBitmap(String src, int max) {
// 获取图片的高和宽
BitmapFactory.Options options = new BitmapFactory.Options();
// 这一个设置使 BitmapFactory.decodeFile获得的图片是空的,但是会将图片信息写到options中
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(src, options);
// 计算比例 为了提高精度,本来是要640 这里缩为64
max = max / 10;
int be = options.outWidth / max;
if (be % 10 != 0)
be += 10;
be = be / 10;
if (be <= 0)
be = 1;
// 设置可以获取数据
options.inJustDecodeBounds = false;
// 获取图片
return BitmapFactory.decodeFile(src, options);
}
// 加水印 也可以加文字
public static Bitmap watermarkBitmap(Bitmap src, Bitmap watermark,
String title) {
if (src == null) {
return null;
}
int w = src.getWidth();
int h = src.getHeight();
// 需要处理图片太大造成的内存超过的问题,这里我的图片很小所以不写相应代码了
Bitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
Canvas cv = new Canvas(newb);
cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src
Paint paint = new Paint();
// 加入图片
if (watermark != null) {
int ww = watermark.getWidth();
int wh = watermark.getHeight();
paint.setAlpha(50);
cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, paint);// 在src的右下角画入水印
}
// 加入文字
if (title != null) {
String familyName = "宋体";
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦