Domanda

Lavorare in Android (1.5), ho un centinaio di immagini in scala di grigi sotto forma di array di byte. Voglio usare le immagini come alfa maschere per disegnare tinte unite in una tela. Le immagini sono fisse, ma i colori possono cambiare. Posso creare bitmap oggetti per ogni combinazione immagine / di colore, ma che sembra terribilmente inefficiente. Quale sarebbe un buon modo per affrontare questo problema, sia in termini di memoria e la velocità? (Ho bisogno di fare questo molte volte per ogni immagine / combinazione di colori.)

È stato utile?

Soluzione

Credo di aver trovato la risposta che cercavo:

  1. Crea un bitmap ARGB_8888 dove ogni colore dei pixel è impostato su (grigio << 24) | 0xFFFFFF.
  2. Per ogni colore, creare un nuovo PorterDuffColorFilter (colore, PorterDuff.Mode.MULTIPLY).
  3. Per rendering, creare un oggetto di pittura e call setColorFilter () con il filtro corrispondente al colore da utilizzare. Quindi chiamare canvas.drawBitmap utilizzando il bitmap e vernice oggetti.

Per un singolo colore, questo probabilmente non è veloce come la costruzione esattamente la bitmap che voglio e disegno senza un oggetto di pittura, ma è molto più efficiente dello spazio di una bitmap per ogni immagine / colore combo.

Altri suggerimenti

contrasto float = 100 / 180.f;             scala float = contrasto + 1.f;

        cm.set(new float[] {
               scale, 0, 0, 0, 0,//Red
               0, 1.5f, 0, 0, 0,//Green
               0, 0, 1.5f, 0, 0,//Blue
               0, 0, 0, 1, 0 });//alpha
        bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);

        Canvas c = new Canvas(bmpGrayscale);
        Paint paint = new Paint();

        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        paint.setColorFilter(f);
        c.drawBitmap(bitmap, 0, 0, paint);
        /*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale);
        photo_view.setBackgroundDrawable(bmd);*/

        photo_view.setImageBitmap(bmpGrayscale);

I userebbe drawImage per i riferimenti nella immagine di una tela, getImageData() per accedere ai pixel, e quindi avvolgere il .data dei dati di immagine, impostando i valori RGB per ogni pixel al costante e il quarto valore (alfa) di che cosa avete ottenuto dall'immagine. È quindi possibile sovrapporre questa tela semi-trasparente sopra quello che vi serve.

Modifica : Ho messo un gruppo di lavoro ad esempio di questo sul mio sito. Funziona solo su Chrome / Safari.

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