2010-10-26 2 views
4

У меня проблемы с памятью и думаю, что это может быть связано с созданием больших растровых изображений.Работа с большими растровыми изображениями (создание небольших растровых изображений для создания обоев)

Задача состоит в том, чтобы получить довольно маленькое изображение плитки и создать более крупное черепичное изображение и установить это как обои для телефона. То, как я делаю это:

1) Создайте представление, которое 2 * ширина экрана, 1 * экран высота

2) Установите вид фона на BitmapDrawable с режимом, установленным в плитке повторить

3) Создание растрового изображения с размерами просмотров

4) Протяните вид растрового изображения с помощью: view.draw (новый холст (растровых))

5) набор wallpper: getApplicationContext() .setWallpaper (б itmap)

Это прекрасно работает на моем телефоне (HTC Magic) и других телефонах, которые я пробовал. Но я получаю сообщения об ошибках, связанные с этой проблемой. Я пытался воссоздать проблему путем удвоения требуемых размеров и проблема, кажется, происходит в 4-м этапе, когда представление втягиваются в растровом изображении:

ERROR/dalvikvm куче (124): Heap Массаж нужен (7372800-байтовое внешнее размещение слишком велико)

Я не уверен, как это решить. Пожалуйста помоги! Благодаря

+0

Так как Android 4.0 есть намного лучше отладки возможности доступна, так как память, используемая для выделения растрового теперь корректно указана в качестве памяти, используемой в куче мониторе в DDMS. Pre-4.0 память, используемая для расстановки растровых изображений, не отображалась на мониторе кучи, поэтому можно было только догадываться, сколько памяти используется в реальности. Возможно, это поможет вам лучше отладить ваш код. – Dude

ответ

1

Я уверен, что вы думали об этом, но тем не менее: Включили ли вы

<uses-permission android:name="android.permission.SET_WALLPAPER" /> 

в своем манифесте-файле?

Вы уверены, что нет никакого исключения? Возможно, это была проблема с показом Тоста.

+0

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

1

Не совсем уверен, что это ваше решение, но вы посмотрели? BitmapFactory.Options.inTempStorage

способ использования это:


BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inTempStorage = new byte[16*1024]; 
Bitmap bitmap_origin = BitmapFactory.decodeFile(path, options); 
0

К сожалению, я не думаю, что вы можете сделать много ... Мы на мобильный телефон здесь; Android ограничивает память процесса до 16 МБ.

Вот несколько советов и трюков, я могу дать вам (потому что у меня есть проблемы SAMES в моем приложении)

  • Вы уверены, что вам нужно 32 бита пикселей? это три 8-битных цветных канала плюс 8-битный альфа-канал. Вы можете использовать RGB_565 для визуально приемлемого результата.

  • Перезарядка изображение, которое вам не нужно при создании растрового изображения (и что вам не нужно будет обратить ваше растровое изображение)

  • null любой другой объект, который вам не нужен

  • Run System.gc(), чтобы заставить сборку мусора непосредственно перед создать Bitmap

Надеется, что это помогает!

+0

И еще один совет, который здесь не очень хорош: не используйте изображения больше, чем нужно :-) – rds

+0

спасибо, но уже пробовал все это и все еще получал сообщения от пользователей время от времени ... может быть, ваше право, возможно, просто ограничьте мобильное устройство и просто нужно оптимизировать все везде, где используются растровые изображения. – Kman

0

На самом деле вы можете реорганизовать свой код. Вы будете иметь более высокую производительность и, вероятно, использовать меньше памяти, если вы не используете View

  1. Создать Bitmap нужного размера bitmap = Bitmap.createBitmap(width,height,Bitamp.Config.RGV_565) (или ARGB_8888, которые могли бы работать тоже)
  2. Создать canvas = new Canvas(bitmap)
  3. Создайте плиточное изображение самостоятельно, с вашего src

упрощенного Кода:

// set another matrix if you want rotation/scaling of the input 
Matrix identity=new Matrix(); 
for (int i=0; i<maxLines; i++) { 
    for (int j=0; j<maxCol; j++) { 
    canvas.draw(src, identity,anyPaint); 
    } 
} 

Держите конец набор обои getApplicationContext().setWallpaper(bitmap)

+0

спасибо, просто попробовал это и кажется хорошей идеей. Его просто трудно понять, какая разница в его создании (сомневаюсь, что это будет сильно влиять на память), поскольку проблема на моем телефоне в первую очередь не возникает. в любом случае спасибо! – Kman

+1

Также в вашем коде должно быть добавлено что-то вроде identity.setTranslate (patternWidth * i, patternHeight * j) перед каждым обратным вызовом. – Kman

Смежные вопросы