Salut les gars, j'ai besoin de votre aide, j'essaie de convertir l'image couleur en niveaux de gris en utilisant la moyenne du rouge, vert, bleu. Mais ça sort avec des erreurs,
Voici mon code
imgWidth = myBitmap.getWidth();
imgHeight = myBitmap.getHeight();
for(int i =0;i<imgWidth;i++) {
for(int j=0;j<imgHeight;j++) {
int s = myBitmap.getPixel(i, j)/3;
myBitmap.setPixel(i, j, s);
}
}
ImageView img = (ImageView)findViewById(R.id.image1);
img.setImageBitmap(myBitmap);
Mais lorsque j'exécute mon application sur Emulator, la fermeture est forcée. Une idée?
J'ai résolu mon problème en utilisant le code suivant:
for(int x = 0; x < width; ++x) {
for(int y = 0; y < height; ++y) {
// get one pixel color
pixel = src.getPixel(x, y);
// retrieve color of all channels
A = Color.alpha(pixel);
R = Color.red(pixel);
G = Color.green(pixel);
B = Color.blue(pixel);
// take conversion up to one single value
R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B);
// set new pixel color to output bitmap
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
}
}
Vous pouvez le faire aussi :
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
imageview.setColorFilter(new ColorMatrixColorFilter(matrix));
Essayez la solution à partir de cette réponse précédente par leparlon :
public Bitmap toGrayscale(Bitmap bmpOriginal)
{
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
Paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, Paint);
return bmpGrayscale;
}
Lalit a la réponse la plus pratique. Cependant, vous vouliez que le gris résultant soit la moyenne du rouge, du vert et du bleu et devriez configurer votre matrice comme suit:
float oneThird = 1/3f;
float[] mat = new float[]{
oneThird, oneThird, oneThird, 0, 0,
oneThird, oneThird, oneThird, 0, 0,
oneThird, oneThird, oneThird, 0, 0,
0, 0, 0, 1, 0,};
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(mat);
Paint.setColorFilter(filter);
c.drawBitmap(original, 0, 0, Paint);
Et enfin, comme j'ai déjà rencontré le problème de la conversion d'une image en niveaux de gris - le résultat le plus agréable dans tous les cas est obtenu en ne prenant pas la moyenne, mais en donnant à chaque couleur un poids différent en fonction de sa luminosité perçue, j'ai tendance à utiliser ces valeurs:
float[] mat = new float[]{
0.3f, 0.59f, 0.11f, 0, 0,
0.3f, 0.59f, 0.11f, 0, 0,
0.3f, 0.59f, 0.11f, 0, 0,
0, 0, 0, 1, 0,};