0

CBZ アーカイブから画像を取得し、PageViewer に表示する必要があります。現時点では、CBZ アーカイブを解凍して SD カードに画像を配置していますが、これは非常に遅いです... 1 つの画像を解凍するのに 8 秒かかります。これを行う他の方法はありますか?CBZ アーカイブを解凍する必要はありませんが、画像を取得して表示するだけです。これをスピードアップするための提案は素晴らしいでしょう。

アーカイブを解凍するコード:

package nl.MarcVale.ComicViewer;

/**
 * Created by Marc on 23-8-13.
 */
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


public class DecompressZip {
private String _zipFile;
private String _location;

public DecompressZip(String zipFile, String location) {
    _zipFile = zipFile;
    _location = location;

    _dirChecker("");
}

public void unzip() {
    try  {
        FileInputStream fin = new FileInputStream(_zipFile);
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry()) != null) {
            Log.v("Decompress", "Unzipping " + ze.getName());

            if(ze.isDirectory()) {
                _dirChecker(ze.getName());
            } else {
                FileOutputStream fout = new FileOutputStream(_location + ze.getName());
                for (int c = zin.read(); c != -1; c = zin.read()) {
                    fout.write(c);
                }

                zin.closeEntry();
                fout.close();
            }

        }
        zin.close();
    } catch(Exception e) {
        Log.e("Decompress", "unzip", e);
    }

}

private void _dirChecker(String dir) {
    File f = new File(_location + dir);

    if(!f.isDirectory()) {
        f.mkdirs();
    }
}
}

編集:答えの後にいくつかのコード:

画像が大きすぎるため、縮小するために zipFile を作成しています。最初の decodeFromStream 行で OutOfMemory 例外が発生しています。

ZipFile zipFile = null;
        try {
            zipFile = new ZipFile("/sdcard/file.cbz");
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
            ZipEntry ze = e.nextElement();
            try {



                //Bitmap bm = BitmapFactory.decodeStream(zipFile.getInputStream(ze));
                Bitmap bm = decodeScaledBitmapFromSdCard(zipFile.getInputStream(ze),width,height);


                pages.add(bm);
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
    }

    public static Bitmap decodeScaledBitmapFromSdCard(InputStream filePath,
                                                      int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        //BitmapFactory.decodeFile(filePath, options);
        BitmapFactory.decodeStream(filePath, null, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeStream(filePath, null, options);
    }

    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }
4

1 に答える 1

0

ZipFileを使用できます。これは、 BitmapFactory.decodeStreamInputStreamを使用してデコードできる for each エントリを提供します。

ZipFile zipFile = new ZipFile(<filename>);
for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
    ZipEntry ze = e.nextElement();
    Bitmap bm = BitmapFactory.decodeStream(zipFile.getInputStream(ze));

}
于 2013-08-23T09:35:52.080 に答える