Desidero stampare una bitmap su una stampante Bluetooth mobile (Bixolon SPP-R200) - l'SDK non offre metodi direkt per stampare una memoria in memoria Immagine. Quindi ho pensato di convertire una bitmap in questo modo:Android: conversione di una bitmap in bitmap monocromatica (1 bit per pixel)
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
In bitmap monocromatica. Sto disegnando un testo nero sopra Bitmap dato usando una tela, che funziona bene. Tuttavia, quando converto la bitmap di cui sopra in un ByteArray, la stampante sembra non essere in grado di gestire quei byte. Sospetto di aver bisogno di una matrice con un bit per pixel (un pixel potrebbe essere bianco = 1 o nero = 0).
quanto non sembra esserci alcun comoda, fuori dalla scatola modo per farlo, un'idea che avevo era di utilizzare:
bitmap.getPixels(pixels, offset, stride, x, y, width, height)
ottenere i pixel. I assumere, avrei dovuto usarla come segue:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
Tuttavia - non sono sicuro di un paio di cose:
- In getPixels - ha senso far passare semplicemente la larghezza l'argomento "Stride"?
- Suppongo che dovrei valutare le informazioni sul colore di ciascun pixel e impostarlo su bianco o nero (e scriverei questo valore in un nuovo array di byte di destinazione che alla fine passerei alla stampante)?
- Come valutare al meglio ciascuna informazione sul colore dei pixel per decidere che dovrebbe essere in bianco o nero? (La bitmap renderizzata è un dolore nero su sfondo bianco)
Questo approccio ha senso? C'è un modo più semplice? Non è sufficiente rendere bianco il bitmap nero &, il problema principale è ridurre le informazioni sul colore per ciascun pixel in un solo bit.
UPDATE
Come suggerito da Ruben io prima convertire il bitmap in una bitmap in bianco e nero. e poi ti iterare su ogni pixel:
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);
}
}
Ora Ruben ha suggerito di "leggere il byte più basso di ogni pixel a 32 bit" - che si riferiscono alla mia domanda su come valutare il colore dei pixel. La mia ultima domanda a questo proposito: faccio ad avere il byte più basso semplicemente facendo questo:
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
ho questa QA recitato perché stavo lavorando su un concetto simile per quanto riguarda la manipolazione di matrici a livello di codice per diventare bitmap monocromatiche. Ho una domanda e la sua risposta finale qui: http://stackoverflow.com/questions/17918978/plot-an-array-into-bitmap-in-cc-for-thermal-printer Se questo aiuta le persone, per favore scrivimi e Verrò con una risposta adatta a questa domanda. –
Perché stai utilizzando GetPixels per caricare tutti i pixel in un singolo array ... Quindi annidare il ciclo attraverso la bitmap AGAIN che chiama le singole chiamate GetPixel (il modo meno efficiente possibile)? Basta scorrere l'array originale, quindi utilizzare SetPixels per reinserire l'intero array nella bitmap. –
@ClintStLaurent buon punto - il codice è davvero vecchio xD - Non penso nemmeno che lo stiamo usando in questa forma più, ma come hai sottolineato correttamente, è molto inefficiente il modo in cui è scritto lì. Sentiti libero di modificarlo secondo il tuo suggerimento. – AgentKnopf