Question

dans les applications de travail (1,5), je possède une centaine d'images en niveaux de gris sous forme de tableaux d'octets. Je veux utiliser les images comme alpha masques pour dessiner des couleurs unies dans une toile. Les images sont fixes, mais les couleurs peuvent changer. Je peux créer des objets Bitmap pour chaque combinaison image / couleur, mais qui semble terriblement inefficace. Quelle serait une bonne façon d'aborder ce problème, en termes de mémoire et de la vitesse? (Je dois faire cela plusieurs fois pour chaque image / combo couleur.)

Était-ce utile?

La solution

Je pense avoir trouvé la réponse que je cherchais:

  1. Créer un ARGB_8888 Bitmap où chaque couleur de pixel est réglé sur (gris << 24) | 0xFFFFFF.
  2. Pour chaque couleur, créer une nouvelle PorterDuffColorFilter (couleur, PorterDuff.Mode.MULTIPLY).
  3. Pour rendre, créer un objet de peinture et setColorFilter d'appel () avec le filtre correspondant à la couleur à utiliser. Ensuite, appelez canvas.drawBitmap en utilisant la peinture et Bitmap objets.

Pour une seule couleur, ce qui est probablement pas aussi vite que la construction exactement Bitmap je veux et le dessin sans objet de peinture, mais il est beaucoup plus efficace que l'un Bitmap pour chaque image / combo couleur.

Autres conseils

Contrairement à flotteur = 100 / 180.f;             échelle flotteur = contraste + 1f;

        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 utiliserait drawImage à blit l'image sur une toile, getImageData() pour accéder aux pixels, puis une boucle sur la .data des données d'image, le réglage des valeurs RVB pour chaque pixel de votre valeur constante et la quatrième (alpha) de ce que tu as de l'image. Vous pouvez ensuite couche cette toile semi-transparente sur tout ce que vous avez besoin.

Modifier : Je l'ai mis un exemple de travail de cette sur mon site. Fonctionne uniquement sur Chrome / Safari.

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