2011-01-17 4 views
36

У меня есть приложение, которое отображает изображения с различным соотношением, измененные внутри (в центре) imageView. Мне нужно создать растровое изображение из ImageView, включая фон (черный в этом случае).Android: как конвертировать весь ImageView в Bitmap?

Так, например, у меня есть экран устройства 320x480, полноэкранный образ с изображением, измененным до 280x480. Как я могу получить растровое изображение 320x480?

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

ответ

88

Вы можете использовать кеш изображения imageView. Он отобразит весь вид, как он выложен (масштабированный, граничит с фоном и т. Д.) С новым растровым изображением.

просто убедитесь, что он построен.

imageView.buildDrawingCache(); 
Bitmap bmap = imageView.getDrawingCache(); 

есть растровое изображение, так как на экране его вид.

+2

Звучит неплохо, но он просто выдает крит с помощью NullPointerException. Это потому, что изображение еще не построено? – yosh

+5

Хорошо, вместе с http://stackoverflow.com/questions/2339429/android-view-getdrawingcache-returns-null-only-null он решил мою проблему :) Спасибо. – yosh

+4

В документации указано, что 'buildDrawingCache()' должно быть обращено на вызов 'destroyDrawingCache' (см. Здесь: http://developer.android.com/reference/android/view/View.html#buildDrawingCache%28boolean%29) –

54

Вы пробовали:

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 
+0

Это дает размер изображения, но это не проблема. Мне нужен быстрый способ создания растрового изображения вместе с черной рамкой. Здесь, я думаю, мне нужно рассчитать ориентацию и середину изображения и обе черные границы, чтобы добавить их вручную в растровое изображение, созданное с изображения. – yosh

+0

Определенно лучшее решение, если вы хотите получить фактическое содержимое ImageView, а не только видимые части. –

+0

Обратите внимание, что imageView.getDrawingCache() получит фактическое представление растрового изображения, битмап будет потерян при очистке кеша. – secretlm

4

Просто мысли вслух здесь (с по общему признанию, мало опыта работы с графикой в ​​Java), может быть что-то подобное будет работать ?:

ImageView iv = (ImageView)findViewById(R.id.imageview); 
Bitmap bitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.RGB_565); 
Canvas canvas = new Canvas(bitmap); 
iv.draw(canvas); 

Из любопытства, Что вы пытаетесь достичь? Может быть, лучший способ достичь своей цели, чем то, что вы имеете в виду.

+1

Мне нужно нарезать весь экран и вы хотите иметь черные края, когда есть, например, только половина изображения на плитке + Я хочу, чтобы изображение было сосредоточено на экране. Canvas возвращает некоторые плохие воспоминания J2ME: D – yosh

+0

Может быть, я не понимаю ... вы просто хотите нарисовать изображение? Вы можете определить растровое изображение в XML, которое будет автоматически разбиваться на разделы. Я не совсем понимаю, о чем вы спрашиваете. – kcoppock

+0

Я хочу обрезать изображения на квадраты (т. Е. 50x50), включая черный фон. Изображения имеют разные цвета/коэффициенты. Я думал, что быстрый способ - создать растровое изображение из всего ImageView, а не только изображение. – yosh

1
try { 
     photo.setImageURI(Uri.parse("Location"); 
     BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable(); 
     Bitmap bitmap = drawable.getBitmap(); 
     bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true); 
     photo.setImageBitmap(bitmap); 

    } catch (Exception e) { 

    } 
0

Это рабочий код

imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(); 
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); 
Смежные вопросы