Android: Convertir une image Bitmap en image Bitmap Monochrome (1 Bit par Pixel)
Je veux imprimer une image à un mobile Bluetooth de l'Imprimante (Bixolon SPP-R200) - le SDK n'offre pas direkt méthodes pour imprimer une image en mémoire. J'ai donc pensé à la conversion d'une image Bitmap comme ceci:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
À une image Bitmap Monochrome. Je suis de dessin, texte noir sur les données ci-dessus Bitmap à l'aide d'une Toile, qui fonctionne bien. Cependant, quand je convertir ci-dessus Bitmap à un objet ByteArray, l'imprimante ne semble pas en mesure de gérer ces octets. Je soupçonne que j'ai besoin d'un Tableau avec un Bit par Pixel (Pixel serait soit blanc = 1 ou noir = 0).
Comme il ne semble pas pratique, hors de la zone de chemin à faire, une idée que j'avais était d'utiliser:
bitmap.getPixels(pixels, offset, stride, x, y, width, height)
pour Obtenir les pixels. Je suppose, j'aurais à utiliser comme suit:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
Cependant - je ne suis pas sûr de savoir quelques petites choses:
- Dans getPixels - t-il un sens à tout simplement passer à la largeur de la "Foulée" argument?
- Je suppose que j'aurais à évaluer l'information de couleur de chaque pixel et soit de le passer en noir ou en blanc (Et j'écrirais cette valeur dans une nouvelle cible tableau d'octets qui je voudrais finalement passer à l'imprimante)?
- La meilleure façon d'évaluer chaque couleur de pixel de l'information afin de décider qu'il doit être noir ou blanc? (Le rendu image est en noir de la douleur sur un fond blanc)
Cette approche du sens à tout? Est-il un moyen plus facile? Il ne suffit pas de faire de l'image bitmap en noir & blanc, la question principale est de réduire l'information de couleur pour chaque pixel dans un peu.
Mise à JOUR
Comme suggéré par Ruben je vais d'abord convertir l'image dans une image Bitmap monochrome. et puis je vais le répéter sur chaque 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);
}
}
Maintenant Reuben a suggéré de "lire le plus faible de l'octet de chaque 32-bit pixel" - qui se rapporte à ma question sur la façon d'évaluer la couleur des pixels. Ma dernière question à ce sujet: Dois-je obtenir la plus faible de l'octet simplement en faisant ceci:
//Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
- J'ai ce QA étoilé parce que je travaillais sur un concept similaire en ce qui concerne par programmation de manipuler des tableaux de devenir des bitmaps monochromes. J'ai une question & son éventuelle réponse ici: stackoverflow.com/questions/17918978/... Si cela aide les gens, merci de m'envoyer un email et je vais venir avec une réponse appropriée à cette question.
- Pourquoi êtes-vous à l'aide de GetPixels pour charger tous les pixels dans un seul tableau... Alors imbriqués en boucle par le biais de l'image bitmap de NOUVEAU appel individuel GetPixel appels (la moins efficace que possible)? Juste une boucle dans votre tableau d'origine, puis utilisez SetPixels de pousser l'ensemble de la matrice de retour dans le bitmap.
- bon le code est vraiment vieux xD - je ne pense pas que nous l'utilisons dans le présent formulaire plus, mais comme vous l'avez souligné correctement, il est très inefficace la façon dont c'est écrit là. N'hésitez pas à modifier en fonction de vos suggestion.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez convertir l'image en monochrome 32bpp à l'aide d'un ColorMatrix.
Qui simplifie la gestion de la couleur->monochrome de conversion. Maintenant, vous pouvez simplement faire un getPixels() et de lire le plus faible de l'octet de chaque 32-bit pixel. Si c'est <128 c'est un 0, sinon c'est un 1.
Bien, je pense qu'il est assez tard pour répondre à ce fil, mais j'ai également travaillé sur ce genre de choses parfois en arrière et a décidé de construire mon propre bibliothèque qui permettra de convertir n'importe quel format jpg ou png image de 1bpp .bmp. La plupart des imprimantes qui nécessitent 1bpp images l'appui de cette image (testé sur l'un de ces :)).
Ici vous pouvez trouver à la bibliothèque ainsi qu'un projet de test qui l'utilise pour faire un monochrome unique de l'image de canal. N'hésitez pas à changer ça..:)
https://github.com/acdevs/1bpp-monochrome-android
Profiter..!! 🙂
Conversion monochrome avec exactement la même taille que l'image d'origine est pas assez à imprimer.
Imprimantes ne peuvent imprimer que chaque "pixel" (dot) monochrome parce que chaque tache d'encre a seulement 1 couleur, de sorte qu'ils doivent utiliser beaucoup plus de points que suffisant et ajuster leur taille, densité... à émuler les niveaux de gris-comme la sensation. Cette technique est appelée de demi-teintes. Vous pouvez voir que les imprimantes ont souvent résolution d'au moins 600 ppp, normalement 1200-4800dpi, bien que l'affichage de l'écran souvent tops à 200-300 ppi.
De sorte que votre bitmap monochrome devrait être au moins 3 fois la résolution d'origine de chaque côté.
Vous devez convertir chaque pixel dans l'espace HSV et utiliser la valeur pour déterminer si le Pixel sur l'image de la cible doit être noir ou blanc: