Как я могу сохранить холст ImageView в растровое изображение?

У меня есть ImageView, в его onDraw(canvas),

я пытался:

canvas.drawBitmap(...);//draw an extremely large background 3264 * 2448 pixels
canvas.drawLine(...);//draw target

Мой вопрос: как я могу сохранить этот холст в формате PNG? Спасибо!


person user1745958    schedule 27.10.2012    source источник


Ответы (2)


Из вопроса здесь: Рисование на холсте и сохранение изображения

imgView.setDrawingCacheEnabled(true);
Bitmap b = imgView.getDrawingCache();

FileOutputStream fos = null;
try {
    fos = new FileOutputStream(getFileName());
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

b.compress(CompressFormat.PNG, 95, fos);
person soren.qvist    schedule 27.10.2012
comment
Спасибо, это решение работает для небольшого растрового изображения, нарисованного в ImageView, но моя головная боль - 3264 * 2448... - person user1745958; 27.10.2012
comment
Может быть, вы могли бы сделать это в отдельном потоке, если вы получаете ANR? - person soren.qvist; 27.10.2012
comment
Спасибо, но это OOM, а не ANR. - person user1745958; 27.10.2012
comment
О, конечно, когда вы получаете ошибку? получить кеш рисования ()? - person soren.qvist; 27.10.2012
comment
Извините, но я не знаю, как вы могли решить эту проблему, я просто недостаточно разбираюсь в растровых изображениях. Если вам не хватает памяти, то вам не хватает памяти, и это потому, что объекты Bitmap занимают так много памяти (особенно в вашем случае). Я бы рассмотрел возможность разделения растрового изображения, я знаю, что есть способ также запросить больше памяти (я думаю, через манифест), вы также можете изучить сжатие растрового изображения, пока оно не подойдет. Возможно, вам также следует изучить, можно ли сохранить Canvas непосредственно на диск, а не передавать его растровому объекту, я не знаю, возможно ли это. Удачи! - person soren.qvist; 27.10.2012

Вы можете сохранить изображение кеша просмотра на диск в формате png.

person Techie Manoj    schedule 27.10.2012
comment
ты имеешь в виду что-то вроде ImageView.setDrawingCacheEnabled(true);ImageView.getDrawingCache() - person user1745958; 27.10.2012
comment
да, а потом получить изображение кеша в виде растрового изображения, вы можете сохранить растровое изображение. - person Techie Manoj; 27.10.2012
comment
это работает для небольшого фонового растрового изображения, моя головная боль в том, что мое растровое изображение очень большое @ 3264 * 2448 пикселей. Я могу отобразить его в ImageView, но не могу получитьDrawingCache()... Я также пробовал что-то вроде Measure(...);layout(...); все равно разбился... - person user1745958; 27.10.2012