Android: jak nakładać bitmapę/rysować bitmapę?

Mam dwa pytania:

  1. czy lepiej narysować obraz na bitmapie lub utworzyć bitmapę jako zasób, a następnie narysować go na bitmapie? Sprawność... który jest lepszy?
  2. Jeśli chcę narysować coś przezroczystego na bitmapie, jak mam to zrobić?
  3. Jeśli chcę nakładać jedną przezroczystą bitmapę na drugą, jak to zrobić?

Przepraszam za długą listę, ale w interesie nauki, chciałbym zbadać zarówno zbliża się...

Author: Legend, 2009-10-09

6 answers

Nie mogę uwierzyć, że nikt jeszcze na to nie odpowiedział! Rzadki przypadek NA SO!

1

Pytanie nie ma dla mnie sensu. Ale ja go dźgnę. Jeśli pytasz o bezpośrednie rysowanie na płótnie (wielokąty, cieniowanie, tekst itp...) VS wczytywanie bitmapy i przesuwanie jej na płótno, które zależałoby od złożoności rysunku. Gdy rysunek staje się bardziej skomplikowany, wymagany czas procesora odpowiednio zwiększy się. Jednak blitting bitmapy na płótnie zawsze będzie stały czas, który jest proporcjonalny do wielkości bitmapy.

2

Nie wiedząc, co to jest "coś", jak mogę ci pokazać, jak to zrobić? Powinieneś być w stanie dowiedzieć się #2 z odpowiedzi na #3.

3

Założenia:

  • bmp1 jest większy z dwóch
  • Chcesz, aby obie nakładały się z lewego górnego rogu.

        private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
            Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
            Canvas canvas = new Canvas(bmOverlay);
            canvas.drawBitmap(bmp1, new Matrix(), null);
            canvas.drawBitmap(bmp2, new Matrix(), null);
            return bmOverlay;
        }
    
 95
Author: Declan Shanaghy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 08:33:30

Możesz zrobić coś takiego:

public void putOverlay(Bitmap bitmap, Bitmap overlay) {
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
    canvas.drawBitmap(overlay, 0, 0, paint);
} 

Pomysł jest bardzo prosty: gdy połączysz bitmapę z kanwą, możesz wywołać dowolną z metod canvas, aby narysować bitmapę.

Będzie to działać dla bitmap z przezroczystością. Bitmapy będą miały przezroczystość, jeśli mają kanał alfa. Spójrz na bitmapę.Config . Prawdopodobnie chciałbyś użyć ARGB_8888.

Ważne: spójrz na Ten przykład Androida dla różnych sposobów wykonywania rysowania. Informatyka bardzo ci pomoże.

Pod względem wydajności (dokładnie pod względem pamięci), bitmapy są najlepszymi obiektami do użycia, ponieważ po prostu zawijają natywną bitmapę. ImageView jest podklasą widoku, a BitmapDrawable zawiera bitmapę wewnątrz, ale zawiera również wiele innych rzeczy. Jest to jednak nadmierne uproszczenie. Możesz zaproponować scenariusz specyficzny dla wydajności, aby uzyskać dokładną odpowiedź.

 28
Author: Lior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-29 10:57:41
public static Bitmap overlayBitmapToCenter(Bitmap bitmap1, Bitmap bitmap2) {
    int bitmap1Width = bitmap1.getWidth();
    int bitmap1Height = bitmap1.getHeight();
    int bitmap2Width = bitmap2.getWidth();
    int bitmap2Height = bitmap2.getHeight();

    float marginLeft = (float) (bitmap1Width * 0.5 - bitmap2Width * 0.5);
    float marginTop = (float) (bitmap1Height * 0.5 - bitmap2Height * 0.5);

    Bitmap overlayBitmap = Bitmap.createBitmap(bitmap1Width, bitmap1Height, bitmap1.getConfig());
    Canvas canvas = new Canvas(overlayBitmap);
    canvas.drawBitmap(bitmap1, new Matrix(), null);
    canvas.drawBitmap(bitmap2, marginLeft, marginTop, null);
    return overlayBitmap;
}
 12
Author: AnsonChen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 03:32:23

Jeśli celem jest uzyskanie bitmapy, jest to bardzo proste:

Canvas canvas = new Canvas();
canvas.setBitmap(image);
canvas.drawBitmap(image2, new Matrix(), null);

Na końcu obraz będzie zawierał nakładanie się obrazu i image2.

 1
Author: Giorgio Barchiesi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 09:41:34

Myślę, że ten przykład z pewnością pomoże Ci nałożyć przezroczysty obraz na inny obraz. Jest to możliwe poprzez rysowanie zarówno obrazów na płótnie, jak i zwracanie obrazu bitmapowego.

Czytaj więcej lub Pobierz demo proszę.

private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){

        Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(firstImage, 0f, 0f, null);
        canvas.drawBitmap(secondImage, 10, 10, null);
        return result;
    }

I wywołać powyższą funkcję na przycisk Kliknij i przekazać dwa obrazy do naszej funkcji, jak pokazano poniżej

public void buttonMerge(View view) {

        Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2);
        Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage);

        img.setImageBitmap(mergedImages);
    }

Dla więcej niż dwóch obrazów, można kliknąć ten link, jak scalić wiele obrazów programowo na Androida

 1
Author: Daniel Nyamasyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 12:53:09
public static Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage, ImageView secondImageView){

    Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(firstImage, 0f, 0f, null);
    canvas.drawBitmap(secondImage, secondImageView.getX(), secondImageView.getY(), null);

    return result;
}
 0
Author: Svitlana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 10:54:56