1. 为什么会写这篇文章?
上周三给我分配了一个任务: YUV转RGB. 把YUV转RGB之后,如何验证转换的RGB数据是否正确呢?我采取的做法是:把转换后的RGB数据写入文件,此文件播放时如果与录制或预览的一样(包括亮度与色度),那么证明YUV转RGB正确,否则错误。因此就涉及到“通过文件流将很多图片存入SD卡”
2. 如何通过文件流将很多图片存入SD卡?
思路: RGB-------->Bitmap------->mBitmap.compress(Bitmap.CompressFormat.PNG,90,fos)
先把代码贴上来:
public void WriteRGBToFile(byte[] frgb)
{
Bitmap mBitmap = MyBitmapFactory.createMyBitmap(frgb, width, height);
//创建文件夹
File folder = new File(Environment.getExternalStorageDirectory() + "/bmpfolder_test");
if(!folder.exists())
{
folder.mkdir();
}
//每帧数据最终以PNG的形式展示出来,一张PNG对应一个文件,所以每一帧数据进来后都需要新建一个文件。
f = new File(folder.getPath(), "/" + (n++)+".bmp");
if (!f.exists()) {
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建文件流
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//压缩成PNG图片
mBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
try {
fos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
在onPreviewFrame里调用上述方法(WriteRGBToFile),也就是每一帧数据进来之后都会调用WriteRGBToFile方法。
3. 注意点:
(3.1)每进来一帧数据都会创建一个文件:
f = new File(folder.getPath(), "/" + (n++)+".bmp");
if (!f.exists()) {
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(3.2)创建文件夹的代码也在WriteRGBToFile方法里,而不是在WriteRGBToFile方法之外
File folder = new File(Environment.getExternalStorageDirectory() + "/bmpfolder_test");
if(!folder.exists())
{
folder.mkdir();
}
(3.3)每帧数据压缩成PNG之后都要把流关闭,而不是在退出程序时关闭,似乎是一个文件对应一个流,有5个文件就有5个文件流
f = new File(folder.getPath(), "/" + (n++)+".bmp");
if (!f.exists()) {
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建文件流
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//压缩成PNG图片
mBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
try {
fos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
4. 总结:
Bitmap -----> PNG
把文件压缩成PNG