Java 如何将位图阵列列表保存到文件
我正在尝试将位图列表保存到文件中。基本上,我想把它保存起来以备将来参考,这样当用户从图库中选择图像时,即使应用程序关闭,它也会留在图库中 这就是我想做的?但是得到了一些异常-BufferUnderFlowException,OutOfMemoryException。问题似乎是位图列表的内存非常大。有没有更好的办法Java 如何将位图阵列列表保存到文件,java,android,image,list,bitmap,Java,Android,Image,List,Bitmap,我正在尝试将位图列表保存到文件中。基本上,我想把它保存起来以备将来参考,这样当用户从图库中选择图像时,即使应用程序关闭,它也会留在图库中 这就是我想做的?但是得到了一些异常-BufferUnderFlowException,OutOfMemoryException。问题似乎是位图列表的内存非常大。有没有更好的办法 final List<Bitmap> bitmapcontent=new ArrayList<Bitmap>(); ImageView i
final List<Bitmap> bitmapcontent=new ArrayList<Bitmap>();
ImageView imageView;
Gallery gallery;
private static byte[] bytesar;
ByteBuffer dst;
private void savethebitmap() throws IOException, ClassNotFoundException {
try {
FileOutputStream fos = openFileOutput("bitmapimage", Context.MODE_PRIVATE);
ObjectOutputStream out=new ObjectOutputStream(fos);
out.writeInt(bitmapcontent.size());
for(int i=0;i<bitmapcontent.size();i++){
out.writeInt(bitmapcontent.get(i).getRowBytes());
out.writeInt(bitmapcontent.get(i).getHeight());
out.writeInt(bitmapcontent.get(i).getWidth());
int bmSize = bitmapcontent.get(i).getRowBytes() * bitmapcontent.get(i).getHeight();
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
out.writeInt(dst.capacity());
dst.position(0);
bitmapcontent.get(i).copyPixelsToBuffer(dst);
if(bytesar==null || bmSize > bytesar.length)
bytesar=new byte[bmSize];
dst.position(0);
dst.get(bytesar);
out.write(bytesar, 0, bytesar.length);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void loadthebitmap() throws IOException,ClassNotFoundException{
try {
freeBitmaps();
FileInputStream fos = openFileInput("bitmapimage");
ObjectInputStream in=new ObjectInputStream(fos);
int size=in.readInt();
for(int i=0;i<size;i++){
int height=in.readInt();
int width=in.readInt();
int bmSize=in.readInt();
if(bytesar==null || bmSize > bytesar.length)
bytesar= new byte[bmSize];
int offset=0;
while(in.available()>0){
offset=offset + in.read(bytesar, offset, in.available());
}
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
dst.position(0);
dst.put(bytesar);
dst.position(0);
Bitmap myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
bitmapcontent.add(myVideoScreenshotBm);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
final List bitmapcontent=new ArrayList();
图像视图图像视图;
画廊;
私有静态字节[]字节;
ByteBuffer dst;
私有void savethebitmap()引发IOException,ClassNotFoundException{
试一试{
FileOutputStream fos=openFileOutput(“bitmapimage”,Context.MODE_PRIVATE);
ObjectOutputStream out=新的ObjectOutputStream(fos);
out.writeInt(bitmapcontent.size());
对于(int i=0;i dst.capacity())
dst=字节缓冲分配(bmSize);
out.writeInt(dst.capacity());
dst位置(0);
bitmapcontent.get(i).copyPixelsToBuffer(dst);
if(字节数==null | | bmSize>bytesar.length)
bytesar=新字节[bmSize];
dst位置(0);
dst.get(bytesar);
out.write(bytesar,0,bytesar.length);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
private void loadthebitmap()引发IOException,ClassNotFoundException{
试一试{
免费位图();
FileInputStream fos=openFileInput(“位图图像”);
ObjectInputStream in=新的ObjectInputStream(fos);
int size=in.readInt();
for(int i=0;i字节长度)
bytesar=新字节[bmSize];
整数偏移=0;
while(in.available()>0){
offset=offset+in.read(bytesar,offset,in.available());
}
如果(dst==null | | bmSize>dst.capacity())
dst=字节缓冲分配(bmSize);
dst位置(0);
dst.put(bytesar);
dst位置(0);
位图myVideoScreenshotBm=Bitmap.createBitmap(宽度、高度、Bitmap.Config.RGB_565);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
添加(myVideoScreenshotBm);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
可能是arraylist太大,堆无法处理它。尝试使用以下命令启动VM:
-Xmx2G -Xms1G
-Xmx代表最大内存,-Xms代表开始时分配的内存。
G代表GB,M代表MB
回答上面评论中的G_S,他似乎使用了ObjectOutputStream
来序列化arraylist
编辑:
如果设备内存不足,您可能希望尝试将位图拆分为块。
输出。writeObject(bitmapContent)
和Bob(应该是)您的叔叔。。。如果您的内存不足,请使用建议增加内存大小。还有。祝你一切顺利,让我知道你进展如何 ObjectOutputStream
缓存写入其中的对象。因此,可以使用simpleDataOutputStream
或调用
这是安卓设备,我不知道这么多内存从哪里来。也发布printStackTrace。虽然有帮助,但OutOfMemoryException仍然没有消失。
out.write(bytesar, 0, bytesar.length);
out.flush();
out.reset();