7
votes

Comment obtenir un bitmap d'une image brute

Je lis une image brute du réseau. Cette image a été lue par un capteur d'image et non d'un fichier.

Ce sont les choses que je connais sur l'image:
~ Hauteur et largeur
~ Taille totale (en octets)
~
grisalcale de 8 bits
~ 1 octet / pixel p>

J'essaie de convertir cette image en un bitmap à afficher dans une vision d'image. P>

Voici ce que j'ai essayé: P>

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt);


0 commentaires

4 Réponses :


1
votes

Une fois que j'ai fait quelque chose comme ça pour décoder le flux d'octets obtenu à partir de l'aperçu de la caméra:

    Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
                        Bitmap.Config.ARGB_8888);


1 commentaires

Merci d'avoir répondu. Que contient le premier paramètre "ImageBytes"? De toutes les versions surchargées de bitmap.createbitmap (...) que je vois dans Javadocs en ligne, aucun ne prend qu'un tableau d'octet en tant que paramètre.



0
votes

Utilisez Création introactive à partir du flux. Voici comment le faire avec une HTTPResponse, mais vous pouvez obtenir l'introuvream de toute façon que vous voulez. xxx



14
votes

Android ne prend pas en charge les bitmaps de niveaux de gris. Donc, la première chose, vous devez prolonger tous les octets à un ARGB Int 32 bits. Alpha est 0xFF, et R, g et b octets sont des copies de la valeur de pixel d'octet de l'image source. Ensuite, créez le bitmap au-dessus de ce tableau.

Aussi (voir commentaires), il semble que l'appareil pense que 0 est blanc, 1 est noir - nous devons inverser les bits source. P>

Supposons que l'image source est dans la matrice d'octet appelée SRC. Voici le code: P>

byte [] src; //Comes from somewhere...
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes.
int i;
for(i=0;i<src.length;i++)
{
    bits[i*4] =
        bits[i*4+1] =
        bits[i*4+2] = ~src[i]; //Invert the source bits
    bits[i*4+3] = 0xff; // the alpha.
}

//Now put these nice RGBA pixels into a Bitmap object

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits));


10 commentaires

@Seva Alekseyev: Merci pour la réponse. J'ai essayé votre suggestion. Je reçois une exception de runtimédia. Selon le logcat "tampon pas assez grand pour les pixels". Je crée le bitmap à l'aide de la largeur et de la hauteur de l'image.


@OceanBlue: Le message suggère que la mémoire tampon de bits est inférieure à 4 * largeur * Hauteur d'octets longs. Vérifiez si c'est le cas. Argb_888 est un format de 4 octets par pixel.


@Ezeva Alekseyev: Je sais certainement que la mémoire tampon BITS est la largeur * Hauteur Bytets Long. L'image est de 1 octet par format pixel. Donc, même si je crée un tableau d'octets 4 fois la taille, l'image serait stockée dans la première ou 4ème partie de celui-ci. Souhaitez-vous connaître un format «1 octet par pixel» à Android?


@Seva Alekseyev: Merci pour votre soutien continu. Je vois une image (Yoohoo !!!). Pour une raison étrange, il est dessiné Lignes blanches sur fond cyan au lieu de lignes noires sur fond blanc . Si vous connaissez la raison, je l'apprécierais beaucoup.


Vous avez probablement pris la première version de My Code Snippet, avec une faute de frappe. Il y avait 1 au lieu de 3 dans la dernière ligne de boucle, les bits rouges n'étaient pas initialisés.


Oh, et un autre point: il semble que le périphérique source d'image pense que 0 est blanc, 1 est noir. Android pense autrement. Donc, si vous voyez votre image dans des couleurs inversées - blanc au lieu de noir et vice versa - il suffit d'inverser l'octet source. Voir Edition2.


Quoi qu'il en soit, merci pour votre guidage, +1 et votre marquage acceptent. Je vais creuser plus pour comprendre pourquoi le blanc tourne à cyan et noir / gris tournant blanc


Oh je viens de voir votre édition2. Essayé. Il a l'air beaucoup mieux, je pense que l'inversion était là. Il s'agit toujours de lignes de cyan foncé sur fond de cyan très léger. D'une manière ou d'une autre, les bits rouges ne sont pas initialisés comme vous l'avez mentionné ...


Maintenant, je ne suis pas sûr de si j'avais la structure de RGBA à droite. Voir Edition3.


C'était ça (rgba)! Il se montre parfaitement maintenant. Beaucoup apprécient votre collision avec moi pour le faire résoudre!



1
votes
//setup color filter to inverse alpha, in my case it was needed
float[] mx = new float[]{
    1.0f, 0, 0, 0, 0, //red
    0, 1.0f, 0, 0, 0, //green
    0, 0, 1.0f, 0, 0, //blue
    0, 0, 0, -1.0f, 255 //alpha
};

ColorMatrixColorFilter cf = new ColorMatrixColorFilter(mx);
imageView.setColorFilter(cf);

// after set only the alpha channel of the image, it should be a lot faster without the conversion step

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(src));  //src is not modified, it's just an 8bit grayscale array
imageview.setImageBitmap(bm);

0 commentaires