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?

È stato utile?

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): alt text alt text alt text alt text

Si ottiene il seguente risultato:


alt text


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));

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top