Не удается сжать переработанный растровый рисунок - PullRequest
9 голосов
/ 13 декабря 2011

Я пытаюсь сохранить макет в изображение на SDCard, но я получаю эту ошибку.Я пробовал несколько кодов, которые я нашел на этом форуме, но все они имеют один и тот же вызов сжатия, который выдает ошибку.

Это код, который я использую для сохранения изображения:

private Bitmap TakeImage(View v) {
        Bitmap screen = null;
        try {
            v.setDrawingCacheEnabled(true);

            v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

            v.buildDrawingCache(true);
            screen = v.getDrawingCache();
            v.setDrawingCacheEnabled(false); // clear drawing cache
        } catch (Exception e) {
            e.printStackTrace();
        }
        return screen;
    }

И это код для сохранения его на SDCard:

private void saveGraph(Bitmap graph, Context context) throws IOException {
        OutputStream fOut = null;
        File file = new File(Environment.getExternalStorageDirectory()
                + File.separator + "test.jpg");
        fOut = new FileOutputStream(file);

        graph.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
        fOut.flush();
        fOut.close();

        MediaStore.Images.Media.insertImage(getContentResolver(),
                file.getAbsolutePath(), file.getName(), file.getName());
}

Яполучаю ошибку:

Невозможно сжать переработанное растровое изображение в вызове сжатия!

Ответы [ 3 ]

16 голосов
/ 13 декабря 2011

Это, вероятно, вызывает повторное использование растрового изображения:

v.setDrawingCacheEnabled(false); // clear drawing cache

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

15 голосов
/ 21 сентября 2012

Это решило мои проблемы.

View drawingView = get_your_view_for_render;
drawingView.buildDrawingCache(true);
Bitmap bitmap = drawingView.getDrawingCache(true).copy(Config.RGB_565, false);
drawingView.destroyDrawingCache();
// bitmap is now OK for you to use without recycling errors.
0 голосов

Решение: вам нужно только скопировать растровое изображение.

imageneViewer.setImageBitmap(lienzo.getDrawingCache().copy(Bitmap.Config.RGB_565, false));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...