一、目的
之前一篇文章说了从视频中截取一帧,这样的方案可以用作视频缩略图的方案
点击打开(视频取帧)。后来想到其他文件类型是否也可以做成缩略图的方式供用户预览,比如txt、doc、excel、ppt、pdf这些文件类型怎么转换成图片呢?
二、过程
搜索了一番,无果。android没有提供相应的API来直接处理这个情况,但是有个方案是,使用webView加载文件,然后保存webview,最后转换为图片,这个方案以后再来探索。
现在我们来说一个txt文件转为图片的情况。txt文件类型是上述几个文件类型中唯一纯文本的文件类型,既然是纯文本的话,我们就可以直接读取文件内容,绘制到画板Canvas中,然后再转换为图片。
因为我们要将这个文本内容展示出来,就要先获取到文本内容,而且还要保留文本格式,不然原本格式丢失,内容展示会很糟糕甚至会看的人产生歧义。
我们创建一个类来保存文本内容以及文本格式,文本格式无非就是记下文本的几行几列,绘制时候就利用行列数来确定图片的宽和高:
public class TextProperty {
private int rows; //读入文本的行数
private int lines = 0; //读入文本的列数
SparseArray<String> context = new SparseArray<String>();
public TextProperty(InputStreamReader in) throws Exception {
int i = 0;
BufferedReader br = new BufferedReader(in);
String s;
while ((s = br.readLine()) != null) {
context.put(i++, s);
this.lines = s.length() > lines ? s.length() : lines;
}
this.rows = i;
in.close();
br.close();
}
public int getHeigt() {
return rows;
}
public SparseArray<String> getContext() {
return context;
}
public int getWidth() {
return this.lines;
}
}
TextProperty 这个类很简单,就不多解释了。接下来看看怎么去绘制了。
private void getBitmapsFromText() {
int x = 5, y = 10;
try {
TextProperty tp = new TextProperty(new InputStreamReader(getResources().getAssets().open("1.txt")));
Bitmap bitmap = Bitmap.createBitmap(20*tp.getWidth(), 20 * tp.getHeigt(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
SparseArray<String> ss = tp.getContext();
for (int i = 0; i < tp.getHeigt(); i++) {
if (ss.get(i) != null) {
canvas.drawText(ss.get(i), x, y, paint);
y = y + 20;
}
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
String path = Environment.getExternalStorageDirectory() + "/image.png";
FileOutputStream os = new FileOutputStream(new File(path));
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, os);
os.flush();
os.close();
} catch (Exception e) {
Log.i("clx", "getBitmapsFromText exception:" + e);
}
}
上面的操作是:
1.打开asset目录下的1.txt文件,以输入流的形式传入TextProperty ,由TextProperty 解析得到文本内容和格式;
2.根据TextProperty 解析获取到的格式,创建一个等宽高的BitMap,每一个字符的宽度设定为20;
3.将文件绘制到Bitmap上,需要以Bitmap为参数创建一个画板Canvas;
4.将绘制完成的Bitmap压缩成JPEG格式的图片,释放资源。
注意: canvas.drawColor(Color.WHITE);画板颜色会默认黑色,所以请在这个设置背景颜色。
三、结束语
1.txt文本转换为图片时只需要拿到文本内容和格式,这里面没有提到编码的问题,如果投入使用的话需要注意;
2.其他的文件类型的文件怎么转换,暂时没有找到Android提供的API帮助。像PDF类型的文件,是由文字和图片组成的,在转换操作上也不是不可行,要解决的问题是从文件流中分析哪部分是文字以及那部分是图片,这个的话pdf转换为图片也是可行的。
3.excel类型文件可以使用jxl.jar作为辅助,先读取出来内容,然后自己绘制空格并填充内容,这个估计操作有些复杂。
如果大家有这方面的知识,欢迎分享下。