png размер загрузки отличается от размера сервера? - PullRequest
0 голосов
/ 07 октября 2010

Мое приложение загружает файлы .png на SD-карту для последующего использования. Я продолжал получать OutOfMemoryErrors (если бы кто-нибудь тоже мог это объяснить, это было бы здорово!), И поэтому я взглянул на размеры изображений, сохраненных на SD-карту, и они, кажется, примерно вдвое больше, чем на сервере. , Почему это так и как я могу сделать их меньше?

public void onCreate(Bundle saved) {

    setContentView(R.layout.namedrxnscreen);
    TextView t1 = (TextView)findViewById(R.id.rxn_text1);
    TextView t2 = (TextView)findViewById(R.id.rxn_text2);
    TextView t3 = (TextView)findViewById(R.id.rxn_text3);
    TextView t4 = (TextView)findViewById(R.id.rxn_text4);
    iv = (ImageView) findViewById(R.id.rxn_image);
    pb = (ProgressBar) findViewById(R.id.rxn_loading);
    vs = (ViewSwitcher) findViewById(R.id.rxn_switch);

    try {

        super.onCreate(saved);
        [ boring stuff here ]

        BitmapDrawable image = getImage(c.getString(5));
        if (image != null) {
            iv.setImageDrawable(getImage(c.getString(5)));
            iv.setBackgroundColor(Color.WHITE);
            vs.setDisplayedChild(1);
        }
        else {
            new DownloadTask().execute(c.getString(5));
        }

    }
    catch (ArrayIndexOutOfBoundsException ea) {
        error = "bah!";
        showDialog(1);
    }
    catch (Exception ex) {
        error = ex.getMessage();
        showDialog(1);
    }
}

protected class DownloadTask extends AsyncTask<String, Integer, Bitmap> {

    @Override
    protected Bitmap doInBackground(String... string) {

        Bitmap d = null;

        try {

            DefaultHttpClient dhc = new DefaultHttpClient();
            HttpGet request = new HttpGet(HTTP_BASE + string[0] + ".png");
            HttpResponse response = dhc.execute(request);
            BufferedInputStream webstream = new BufferedInputStream(response.getEntity().getContent());
            d = writeToSd(string[0], webstream, d);

        }
        catch (Exception ex) { errorCatch(ex.getMessage()); }

        return d;

    }

    private Bitmap writeToSd(String string, BufferedInputStream webstream, Bitmap d) {

        try {

            webstream.mark(3);
            webstream.reset();
            File f = new File(Environment.getExternalStorageDirectory() + SD_DIR);
            f.mkdirs();
            File f2 = new File(f, string + ".png");
            f2.createNewFile();
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(f2));

            int len;
            byte[] buffer = new byte[1024];
            while ((len = webstream.read(buffer)) > 0) {

                fos.write(buffer, 0, len);

            }

            webstream.close();
            //fos.flush();
            fos.close();

            FileInputStream fis = new FileInputStream(new File(f, string + ".png"));
            d = BitmapFactory.decodeStream(fis);
            return d;

        }
        catch (Exception ex) {

            errorCatch(ex.getMessage());
            return null;

        }


    }

    protected void onPostExecute(Bitmap result) {

        if (result != null) {
            iv.setImageBitmap(result);
            iv.setBackgroundColor(Color.WHITE);
            vs.setDisplayedChild(1);
        }

    }

}

protected BitmapDrawable getImage(String name) {

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

        try {

            //Gets the SD card file, whacks it in a stream
            File f = new File(Environment.getExternalStorageDirectory() + SD_DIR, name + ".png");

            if (f.exists()) {

                InputStream s = new FileInputStream(f);

                try {

                    //Return the decoded bitmap
                    BitmapDrawable d = new BitmapDrawable(getResources(), 
                            BitmapFactory.decodeStream(s)); //gives an OutOfMemoryError if png > ~30KB
                    return d;

                } catch (OutOfMemoryError ex) {

                    Toast.makeText(this, "An OutOfMemoryError occured and" +
                            " the image was loaded at a lower quality.", Toast.LENGTH_SHORT).show();
                    BitmapFactory.Options mOptions = new BitmapFactory.Options();
                    mOptions.inSampleSize = 4;
                    BitmapDrawable d = new BitmapDrawable(getResources(), 
                            BitmapFactory.decodeStream(s, null, mOptions));
                    return d;

                }

            }
            else return null;

        }
        catch (Exception ex) {
            return null;

        }

    }
    else {
        Toast.makeText(this, "External storage not available. Downloading from internet.",
                Toast.LENGTH_SHORT).show();
        return null;
    }

}

1 Ответ

0 голосов
/ 07 октября 2010

Изображение, загружаемое с сервера, выполняется байтом за байтом и не может быть магически увеличено в два раза ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...