Frage

Arbeiten in Android (1.5), habe ich hundert oder so Graustufenbilder in Form von Byte-Arrays. Ich möchte zum Zeichnen von Volltonfarben in einer Leinwand die Bilder als Alpha-Masken verwenden. Die Bilder sind festgelegt, aber die Farben ändern. Ich kann erstellen Bitmap-Objekte für jedes Bild / Farbkombination, aber das scheint schrecklich ineffizient. Was wäre ein guter Weg, um dieses Problem zu nähern, sowohl in Bezug auf Speicher und Geschwindigkeit? (Ich brauche dies viele Male für jedes Bild / Farbkombination zu tun.)

War es hilfreich?

Lösung

Ich glaube, ich fand die Antwort die ich suchte:

  1. Erstellen Sie eine ARGB_8888 Bitmap, wo jede Pixelfarbe wird auf (grau << 24) | 0xFFFFFF.
  2. Für jede Farbe erstellen Sie einen neuen PorterDuffColorFilter (Farbe, PorterDuff.Mode.MULTIPLY).
  3. Um zu machen, ein Farbobjekt und Call setColorFilter () mit dem Filter erstellen, um die Farbe entsprechend verwendet werden. Dann rufen canvas.drawBitmap die Bitmap Paint Objekte verwenden.

Für eine einzelne Farbe, ist dies wahrscheinlich nicht so schnell wie Gebäude genau die Bitmap ich will und ohne Farbe Objekt zeichnen, aber es ist viel mehr Platz effizienter als ein Bitmap für jedes Bild / Farbe kombiniert.

Andere Tipps

float Kontrast = 100 / 180.f; float scale = Kontrast + 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 würde drawImage, um das Bild auf eine Leinwand blitten, getImageData() die Pixel zuzugreifen, und dann die Schleife über die .data der Bilddaten für jedes Pixel auf Ihre Konstante, die den RGB-Wert einstellen, und den vierten (alpha) Wert was Sie aus dem Bild bekommen. Sie können dann die Schicht dieses halbtransparenten Leinwand über alles, was Sie benötigen.

Bearbeiten : Ich habe setzen ein funktionierendes Beispiel dieser auf meiner Website. Dies funktioniert nur auf Chrome / Safari.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top