2013-01-25 4 views
12

У меня есть приложение для Android, которое загружает изображение в растровое изображение и отображает его в ImageView. Проблема заключается в том, что изображение имеет прозрачный фон; это приводит к тому, что часть черного текста на изображении исчезает на черном фоне.Android Bitmap: конвертировать прозрачные пиксели в цвет

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

Итак - я хочу преобразовать прозрачные пиксели в растровое изображение в сплошной цвет, но я не могу понять, как это сделать!

Любая помощь была бы оценена!

Благодаря Chris

+0

Если у вас был снимок экрана, который действительно помог бы. Мне кажется, что вы пытаетесь решить это неправильно. Я бы попытался сложить взгляды друг на друга, чтобы получить желаемый эффект. Таким образом, у вас есть основной цветной режим заднего плана, затем накладывайте его на изображение с белым фоном и исходным изображением. – Nathan

ответ

22

Если вы включаете изображение в качестве ресурса, то проще всего просто отредактировать изображение себя в программе, как gimp. Вы можете добавить свой фон туда и быть уверенным, что он будет выглядеть и не использовать для обработки мощности, изменяя изображение каждый раз, когда он загружается.

Если у вас нет контроля над изображением самостоятельно, вы можете изменить его, сделав что-то вроде, считая, что ваш Bitmap называется image.

Bitmap imageWithBG = Bitmap.createBitmap(image.getWidth(), image.getHeight(),image.getConfig()); // Create another image the same size 
imageWithBG.eraseColor(Color.WHITE); // set its background to white, or whatever color you want 
Canvas canvas = new Canvas(imageWithBG); // create a canvas to draw on the new image 
canvas.drawBitmap(image, 0f, 0f, null); // draw old image on the background 
image.recycle(); // clear out old image 
+0

Спасибо, что сделал! Эффективно! – ccbunney

5

Вы можете цикл через каждый пиксель и проверить, если он прозрачен.

Нечто подобное. (Непроверенная)

 Bitmap b = ...; 
     for(int x = 0; x<b.getWidth(); x++){ 
      for(int y = 0; y<b.getHeight(); y++){ 
       if(b.getPixel(x, y) == Color.TRANSPARENT){ 
        b.setPixel(x, y, Color.WHITE); 
       } 
      } 
     } 
+2

Если вы собираетесь использовать эту стратегию, не используйте 'getPixel'. Каждый раз, когда вы перебираете каждый пиксель в битмапе, вы должны одобрять ['getPixels'] (http://developer.android.com/reference/android/graphics/Bitmap.html#getPixels%28int [],% 20int, % 20int,% 20int,% 20int,% 20int,% 20int% 29). – kabuko

+1

@MrZander - я пробовал этот метод, и он не работал. Добавление инструкции отладки показало, что она находила пиксели TRANSPARENT, но установка их на WHITE (или RED или любой другой цвет) не повлияла. Изображение все еще кажется прозрачным .... странным ??? – ccbunney

+0

@KernowBunney Вероятно, потому что ваш растровый рисунок не изменен. Попробуйте выполнить «Bitmap b = yourbitmap.copy (Bitmap.Config.ARGB_8888, true)» и установить новое растровое изображение в качестве изображения. Кроме того, этот метод непроверен, и я не знаю, является ли он наиболее эффективным методом. @kabuko может иметь смысл. – MrZander

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