Chcę wydrukować mapę bitową na przenośnej drukarce Bluetooth (Bixolon SPP-R200) - SDK nie oferuje metod direkt do drukowania w pamięci obraz. Tak więc pomyślałem o konwersji bitmapy w następujący sposób:Android: Konwertowanie mapy bitowej na monochromatyczną bitmapę (1 bit na piksel)
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Do monochromatycznej bitmapy. Rysuję czarny tekst na powyższej bitmapie za pomocą płótna, które działa dobrze. Jednak po konwersji powyższej bitmapy na ByteArray, drukarka wydaje się nie być w stanie obsłużyć tych bajtów. Podejrzewam, że potrzebuję tablicy z jednym bitem na piksel (piksel będzie albo biały = 1 albo czarny = 0).
Ponieważ nie wydaje się być wygodne, z drogi, pola do zrobienia, że jeden pomysł miałam używać:
bitmap.getPixels(pixels, offset, stride, x, y, width, height)
uzyskać pikseli. Przypuszczam, że będę musiał go używać w następujący sposób:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
jednak - nie jestem pewien, o kilka rzeczy:
- W getPixels - czy to ma sens, aby po prostu przejść jak szerokość argument "krok"?
- Chyba będę musiał ocenić informacje o kolorze każdego piksela i albo przełączyć go na czarny lub biały (I napisałbym tę wartość w nowej docelowej tablicy bajtów, którą ostatecznie przekazałbym do drukarki)?
- Jak najlepiej ocenić informacje o kolorach poszczególnych pikseli, aby można było wybrać kolor czarny lub biały? (Renderowana bitmapa to czarny ból na białym tle)
Czy to podejście ma sens? Czy istnieje prostszy sposób? Nie wystarczy tylko sprawić, by bitmapa była czarna, a główną kwestią jest zredukowanie informacji o kolorach dla każdego piksela w jeden bit.
UPDATE
Jak sugeruje Rubena będę najpierw przekonwertować bitmapę do bitmap monochromatycznych. i wtedy będę iterować każdego piksela:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// Iterate over height
for (int y = 0; y < height; y++) {
int offset = y * height;
// Iterate over width
for (int x = 0; x < width; x++) {
int pixel = bitmap.getPixel(x, y);
}
}
Teraz Reuben zasugerował „czytać najniższą bajt każdego piksela 32-bit” - które odnoszą się do mojego pytania o tym, jak ocenić kolor piksela. Moje ostatnie pytanie w tej kwestii: Czy dostanę najniższą bajt po prostu w ten sposób:
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
mam to QA wystąpił bo byłem w pracy na podobnym koncepcji w odniesieniu do programowego manipulowania tablicami, aby stać się monochromatycznymi mapami bitowymi. Mam pytanie i jego ostateczną odpowiedź tutaj: http://stackoverflow.com/questions/17918978/plot-an-array-into-bitmap-in-cc-for-thermal-printer Jeśli to pomaga ludziom, napisz do mnie i Wymyślę odpowiednią odpowiedź na to pytanie. –
Dlaczego używasz GetPixels do załadowania wszystkich pikseli do pojedynczej tablicy ... Następnie zagnieżdżona pętla poprzez bitmapę PONOWNIE wywołując poszczególne wywołania GetPixel (najmniej efektywny sposób)? Po prostu przeprowadź pętlę przez oryginalną tablicę, a następnie użyj SetPixels, aby przesunąć całą tablicę z powrotem do bitmapy. –
@ClintStLaurent dobry punkt - kod jest naprawdę stary xD - nie sądzę, że używamy go już w tej formie, ale jak wskazałeś poprawnie, jest to bardzo nieefektywne, jak jest napisane. Możesz go edytować zgodnie z sugestią. – AgentKnopf