it-swarm.com.de

Android: Wie kann man eine Bitmap überlagern/zeichnen?

Ich habe eigentlich zwei Fragen:

  1. Ist es besser, ein Bild auf einer Bitmap zu zeichnen oder eine Bitmap als Ressource zu erstellen und es dann über eine Bitmap zu zeichnen? Performance weise ... welches ist besser?
  2. Wenn ich etwas transparent über eine Bitmap zeichnen möchte, wie würde ich dann vorgehen?
  3. Wenn ich eine transparente Bitmap über eine andere überlagern möchte, wie würde ich das tun?

Entschuldigung für die lange Liste, aber im Interesse des Lernens möchte ich beide Ansätze untersuchen ...

54
Legend

Ich kann nicht glauben, dass noch niemand darauf geantwortet hat! Ein seltenes Vorkommen auf SO!

1

Die Frage macht für mich keinen Sinn. Aber bitte geben Sie ihm einen Stich ... Wenn Sie nach direktem Zeichnen auf eine Leinwand fragen (Polygone, Schattierung, Text usw.), VS Laden Sie eine Bitmap und legen Sie sie auf die Leinwand Zeichnung. Mit zunehmender Komplexität der Zeichnung wird die erforderliche CPU-Zeit entsprechend erhöht. __ Wenn Sie jedoch eine Bitmap auf eine Leinwand setzen, ist dies immer eine konstante Zeit, die proportional zur Größe der Bitmap ist.

2

Ohne zu wissen, was "etwas" ist, wie kann ich Ihnen zeigen, wie es geht? Sie sollten in der Lage sein, # 2 aus der Antwort für # 3 herauszufinden.

3

Annahmen:

  • bmp1 ist der größere der beiden
  • sie möchten beide von der oberen linken Ecke überlagert werden.

        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;
        }
    
98
Declan Shanaghy

Sie können so etwas tun:

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

Die Idee ist sehr einfach: Nachdem Sie einer Leinwand eine Bitmap zugeordnet haben, können Sie eine beliebige Methode der Leinwand aufrufen, um über die Bitmap zu zeichnen.

Dies funktioniert für Bitmaps mit Transparenz. Eine Bitmap hat Transparenz, wenn sie einen Alphakanal hat. Schauen Sie sich Bitmap.Config an. Sie möchten wahrscheinlich ARGB_8888 verwenden.

Wichtig: In this Android-Beispiel finden Sie verschiedene Möglichkeiten zum Zeichnen. Es wird dir sehr helfen.

In Bezug auf die Leistung (in Bezug auf den Speicher, um genau zu sein), sind Bitmaps die besten Objekte, die verwendet werden sollen, da sie einfach eine native Bitmap umschließen. Eine ImageView ist eine Unterklasse von View, und eine BitmapDrawable enthält eine Bitmap, aber auch viele andere Dinge. Dies ist jedoch eine zu starke Vereinfachung. Sie können ein leistungsspezifisches Szenario für eine genaue Antwort vorschlagen.

28
Lior
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
AnsonChen

Ich denke, dieses Beispiel wird Ihnen auf jeden Fall helfen, ein transparentes Bild über ein anderes Bild zu legen. Dies wird ermöglicht, indem sowohl die Bilder auf Leinwand gezeichnet als auch ein Bitmap-Bild zurückgegeben werden.

Lesen Sie mehr oder laden Sie die Demo herunter hier

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

und rufen Sie die obige Funktion auf Knopfdruck auf und übergeben Sie die beiden Bilder wie unten gezeigt an unsere Funktion

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

Für mehr als zwei Bilder können Sie diesem Link folgen, wie Sie mehrere Bilder programmatisch unter Android zusammenführen

1
Daniel Nyamasyo

Wenn das Ziel ist, eine Bitmap zu erhalten, ist dies sehr einfach:

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

Am Ende enthält image die Überlappung von image und image2.

1
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
Svitlana