2013-01-25 10 views
12

Mam aplikację na Androida, która ładuje obraz jako bitmapę i wyświetla go w ImageView. Problem polega na tym, że obraz wydaje się mieć przezroczyste tło; powoduje to zniknięcie czarnego tekstu na czarnym tle.Android Bitmap: Konwertuj przezroczyste piksele na kolor

Jeśli ustawię tło ImageView na białe, tego rodzaju prace, ale dostaję brzydkie duże obramowania na obrazie, gdzie jest rozciągnięty, aby pasował do rodzica (rzeczywisty obraz jest skalowany w środku).

A więc - chcę przekonwertować przezroczyste piksele w bitmapie na jednolity kolor - ale nie wiem, jak to zrobić!

Każda pomoc będzie doceniona!

Dzięki Chris

+0

Jeśli miałbyś zrzut ekranu, który naprawdę pomógłby. Wydaje mi się, że próbujesz rozwiązać ten problem w niewłaściwy sposób. Postarałbym się ułożyć warstwy widokowe jeden na drugim, aby uzyskać pożądany efekt. W ten sposób uzyskasz główny widok koloru, a następnie pokryjesz go widokiem obrazu z białym tłem i obrazem źródłowym. – Nathan

Odpowiedz

22

Jeśli w tym obraz jako zasób, najłatwiej jest po prostu edycji obrazu siebie w programie takim jak gimp. Możesz dodać tam swoje tło i mieć pewność, jak będzie wyglądać i nie będzie używane do przetwarzania mocy zmieniającej obraz za każdym razem, gdy zostanie załadowany.

Jeśli nie masz kontroli nad obrazem, możesz go zmodyfikować, wykonując coś podobnego, zakładając, że twoja Bitmap nazywa się 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

Dzięki - to zrobił! Efektywny też! – ccbunney

5

Można pętli każdego piksela i sprawdzić, czy jest przejrzyste.

Coś takiego. (Nietestowane)

 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

Jeśli używasz tej strategii, nie używaj 'getPixel'. Za każdym razem, gdy przeglądasz każdy piksel w "Bitmapie", powinieneś faworyzować ['getPixels'] (http://developer.android.com/reference/android/graphics/Bitmap.html#getPixels%28int [],% 20int, % 20int,% 20int,% 20int,% 20int,% 20int% 29). – kabuko

+1

@MrZander - Próbowałem tej metody i nie działało. Dodanie instrukcji debugowania pokazało, że znajdowało TRANSPARENTNE piksele, ale ustawienie ich na BIAŁY (lub CZERWONY lub jakikolwiek inny kolor) nie ma wpływu. Obraz nadal wydaje się mieć przezroczystość ... dziwne ??? – ccbunney

+0

@KernowBunney Prawdopodobnie dlatego, że Twoja mapa bitowa nie jest zmienna. Spróbuj wykonać 'Bitmap b = yourbitmap.copy (Bitmap.Config.ARGB_8888, true)' i ustawić nową bitmapę jako obraz. Ta metoda nie została przetestowana i nie wiem, czy jest to najskuteczniejsza metoda. @kabuko może mieć punkt. – MrZander

Powiązane problemy