Canali Android Modifica Bitmap
-
14-10-2019 - |
Domanda
E 'possibile accedere al canale alfa di un dato bitmap con extractAlpha()
, ma non sono stato in grado di trovare un modo per impostare in realtà il canale alfa di una bitmap.
Come si può più immagini in scala di grigi essere ricombinati come canali in una bitmap con Android?
Soluzione
E 'del tutto possibile ri-combinare canali separati eseguire in un'immagine ARGB. Hai solo bisogno le immagini del canale in scala di grigi e un'immagine con il canale alfa che si desidera - nota che si tratta di non di un'immagine in scala di grigio opaco, ma un'immagine con il alpha si desidera. È quindi disegna ogni canale con un Paint
utilizzando il PorterDuffXfermode
appropriata su un vuoto, Bitmap nero-riempita.
// 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...
Con il codice di cui sopra e le seguenti 4 immagini (rosso, verde, blu e alfa, rispettivamente):
Si ottiene il seguente risultato:
Solo una breve nota: l'ovale rosso è un opaco, ovale rosso su uno sfondo trasparente - il colore non importa per questo, ma l'alfa non
Altri suggerimenti
manipolare bitmap è una cosa farily semplice, quando per accedere ai pixel (byte) direttamente. Per fare questo in Android si può fare su questo approch
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] b = bos.toByteArray();
Ora si può fare qualsiasi manipolazione delle immagini, tranformation o la combinazione che ti piace.
Spero che questo è ciò che stavate cercando.
Hai provato con tela? Le seguenti si presenta come un hack, ma forse funzionerà. Non ho provato io stesso.
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));