Question

Il est possible d'accéder au canal alpha d'un bitmap donné avec extractAlpha(), mais je n'ai pas été en mesure de trouver un moyen de mettre réellement le canal alpha d'un bitmap.

Comment plusieurs images recombinées comme niveau de gris canaux dans un Bitmap avec Android?

Était-ce utile?

La solution

Il est tout à fait possible de recombiner des canaux séparés dos en une image ARVB. Vous avez juste besoin des images de canal en niveaux de gris et une image avec le canal alpha que vous voulez - noter que ceci est pas une image en niveaux de gris opaque, mais une image avec alpha vous voulez. Vous dessinez ensuite chaque canal avec un Paint en utilisant la PorterDuffXfermode appropriée sur un blanc, Bitmap noir rempli.

// have your 3 channel grayscales and 1 alpha bitmap loaded by this point

Paint redPaint = new Paint();
redPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
redPaint.setShader(new BitmapShader(redChanImg, TileMode.CLAMP, TileMode.CLAMP));
redPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, Mode.DARKEN));

Paint greenPaint = new Paint();
greenPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
greenPaint.setShader(new BitmapShader(greenChanImg, TileMode.CLAMP, TileMode.CLAMP));
greenPaint.setColorFilter(new PorterDuffColorFilter(Color.GREEN, Mode.DARKEN));

Paint bluePaint = new Paint();
bluePaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
bluePaint.setShader(new BitmapShader(blueChanImg, TileMode.CLAMP, TileMode.CLAMP));
bluePaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, Mode.DARKEN));

Paint alphaPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
alphaPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

c.setBitmap(resultImage);
c.drawRect(0, 0, width, height, redPaint);
c.drawRect(0, 0, width, height, greenPaint);
c.drawRect(0, 0, width, height, bluePaint);
c.drawBitmap(alphaImg, 0, 0, alphaPaint);

//save off resultImage, display it, etc...

Avec le code ci-dessus et les suivants 4 images (rouge, vert, bleu et alpha, respectivement): text alt text alt text alt

Nous obtenons le résultat suivant:


text alt


Juste un petit mot: l'ovale rouge est opaque, ovale rouge sur un fond transparent - la couleur n'a pas d'importance pour celui-ci, mais l'alpha fait

Autres conseils

est une manipuler les bitmaps chose farily simple, quand pour accéder aux pixels (octets) directement. Pour ce faire dans Android, vous pouvez le faire sur cette approch

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); 
byte[] b = bos.toByteArray();  

Vous pouvez maintenant faire toute manipulation d'image, tranformation ou combinaison comme.

J'espère que c'est ce que vous recherchez.

Avez-vous essayé avec de la toile? Les regards suivants aiment un hack, mais peut-être cela va fonctionner. Je ne l'ai pas testé moi-même.

    Bitmap bitmap;
    int color = bitmap.getPixel(1, 123);
    Rect rect = new Rect(1,123,2,124);
    Canvas c = new Canvas(bitmap);
    c.clipRect(rect);
    c.drawARGB(50, Color.red(color), Color.green(color), Color.blue(color));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top