1

ビットマップ リストをファイルに保存しようとしています。基本的に、ユーザーがギャラリーから画像を選択すると、アプリが閉じてもそこにとどまるように、将来の参照用に保存したいと考えています。

これは私がやろうとしていることですか?しかし、多数の Exception-BufferUnderFlowException、OutOfMemoryException を取得します。ビットマップ リストのメモリが非常に大きいことが問題のようです。これを行うより良い方法はありますか?

    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();
    }
4

3 に答える 3

0

ObjectOutputStream書き込まれたオブジェクトをキャッシュします。したがって、simpleを使用するかDataOutputStreamObjectOutputStream.reset

    out.write(bytesar, 0, bytesar.length);
    out.flush();
    out.reset();
于 2012-12-17T04:37:06.020 に答える
0

arraylist が大きすぎて、ヒープがそれを処理できない可能性があります。次を使用して VM を起動してみてください。

-Xmx2G -Xms1G

-Xmx は最大メモリを表し、-Xms は開始時に割り当てられたメモリを表します。G は GB を表し、M は MB を表します。

上記のコメントで G_S に返信すると、彼はObjectOutputStreamarraylist をシリアル化するために使用したようです。

編集:

デバイスに十分なメモリがない場合は、ビットマップをチャンクなどの断片に分割してみてください。

于 2012-12-17T04:31:17.590 に答える
0

out.writeObject(bitmapContent)とボブ (する必要があります) あなたの叔父.それでメモリが不足している場合は、提案を使用してメモリ サイズを増やします。そして、さらにヒントがあります。よろしくお願いします。

于 2012-12-17T04:35:15.680 に答える