2017-09-10 4 views
2

J'ai une image bitmap chargée en mémoire sous la forme d'un objet Bitmap. Je peux charger ceci dans un ImageView, faire des opérations en utilisant Canvas et ainsi de suite. Mais pour un algorithme que j'utilise j'ai besoin de bitmaps d'échelle de gris de 3 canaux. L'image ci-dessous est tirée d'un article écrit par Eric Z Goodnight sur Comment Geek. Le lien est donné ci-dessous.comment extraire les canaux de bitmap rouge, vert et bleu sous Android

https://www.howtogeek.com/howto/42393/rgb-cmyk-alpha-what-are-image-channels-and-what-do-they-mean/

enter image description here Comme vous pouvez le voir dans les images d'échelle de gris correspondant à chaque canal les zones de couleurs respectives sont plus brillants. Comment puis-je extraire les images d'échelle de gris correspondant à chaque canal d'une image Bitmap dans Android? J'ai besoin de 3 objets bitmaps contenant ces 3 échelles de gris de canal respectivement. J'ai trouvé une méthode pour créer une échelle de gris en réglant la saturation de ColorMatrix sur 0.Mais il revient sur une échelle de gris.Il existe un moyen d'obtenir aux 3 canaux?

+0

Pourriez-vous élaborer sur ce point? Je n'ai pas beaucoup d'expérience avec ColorMatrices. Toute aide serait vraiment appréciée. –

Répondre

1

Un pixel au format bitmap est représenté par un entier de 4 octets, qui décrit les canaux alpha, rouge, vert et bleu de ce pixel. Pour extraire un canal particulier, vous pouvez simplement faire un OR bit à bit sur chaque pixel, avec la valeur hexadécimale appropriée.

Par exemple, 0xFFFF0000 représente max alpha (FF), max rouge (FF), zéro vert et zéro bleu. Donc, le OU bit à bit pour chaque pixel, les canaux vert et bleu seront ignorés, car ils sont nuls (00).

Quoi qu'il en soit, le code pourrait ressembler ci-dessous pour extraire le red channel:

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFFFF0000); 
    } 
} 

Par conséquent, le green channel peut être obtenu par:

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF00FF00); 
    } 
} 

et blue channel:

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF0000FF); 
    } 
} 

Enfin, pour afficher l'image en niveaux de gris vous pouvez utiliser ColorMatrix pour le widget de visualisation d'image:

ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    imageView.setColorFilter(filter); 
+0

Merci pour la réponse détaillée. Je vais essayer cela et posterai mes résultats aussi. J'espère que ce post aidera beaucoup d'autres développeurs. –