1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Anti Aliasing bei einem Bitmap ..!

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von BFK, 24.05.2012.

  1. BFK, 24.05.2012 #1
    BFK

    BFK Threadstarter Erfahrener Benutzer

    Beiträge:
    160
    Erhaltene Danke:
    10
    Registriert seit:
    08.12.2010
    Hallo,
    Ich habe folgendes Problem.
    Ich übergebe einem Bimap ein Bild, dass ich später mittels einer Matrix drehe bzw. rotiere. Nun ist das Bild ein wenig verpixelt, daher versuche ich eine anti-aliasing methode zu benutzen oder etwas ähnliches.
    Das alles passiert NICHT in einer onDraw-Methode (da könnte ich ja ganz einfach paint benutzen und die drawBitmap-Methode)
    Nun finde ich nix bei der Bitmap-Klasse das ich benutzen könnte.
    Für das bessere Verständnis, hier der Code..:

    Code:
    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.bild);        
    Matrix mt = new Matrix();        
    mt.postRotate(g); // g ist um wieviel grad sich das bild drehen soll
                    
    Bitmap nbm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mt, false);
    
    Also ich hätte gern, dass das Bild rotiert aber nicht verpixelt.

    Wie könnte ich das anstellen ..?
     
  2. DieGoldeneMitte, 24.05.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Zu der Bitmap einen Canvas erzeugen und den benutzen um die original Bitmap gedreht in deine Bitmap hineinzumalen? Kannst dann mit dem Paint sagen, wie er malen soll.
     
    BFK bedankt sich.
  3. BFK, 24.05.2012 #3
    BFK

    BFK Threadstarter Erfahrener Benutzer

    Beiträge:
    160
    Erhaltene Danke:
    10
    Registriert seit:
    08.12.2010
    Hallo und danke für deine Antwort..!

    Meine Frage wäre jetzt wie bekomme ich mein Canvas-Object in ein Bitmap..?
    Oder anders gefragt wie male ich in meine Bitmap ..?

    So sieht mein Code jetzt aus..:
    Code:
    
    Bitmap bmo = BitmapFactory.decodeResource(getResources(), R.drawable.bild).copy(Bitmap.Config.ARGB_8888, true);
            
    Matrix mt = new Matrix();        
    mt.postRotate(g);
            
    /*-----*/
    Canvas cv = new Canvas(bmo);
    Paint pn = new Paint();
    pn.setAntiAlias(true);
    pn.setFilterBitmap(true);
    cv.drawBitmap(bmo, mt, pn);
    /*-----*/        
    
    


    Der ursprüngliche Beitrag von 20:25 Uhr wurde um 21:35 Uhr ergänzt:

    Ich ziehe die Frage zurück.
    Wenn man per Canvas das Bild ändert (rotiert) wird es automatisch wieder im benutzten Bitmap gespeichert.
    Also kann man dann einfach das benutzte Bitmap verwenden. In meinem Fall "bmo". Ich habs nicht gleich gesehen, da ich ausgerechnet einen falschen Wert für g benutz hab.
    Naja egal, jetzt stehe ich vor einem neuem Problem. Der ganze Codeteil befindet sich in eine Methode die das rotierte Bitmap zurückgibt.
    Diese Methode rufe ich oft ab und lösche vor dem erneuten Aufruf immer die alte Bitmap. Das Problem ist, dass bei meinem neuem Code das nicht mehr passiert, also wenn meine Bitmap rotiert bleibt die "alte" noch da.
    Wieso passiert das..?
    Ich vermute es liegt an Canvas.

    Für das bessere Verständnis hier mein alter Code (ohne anti Aliasing):
    Code:
    private Bitmap rotate_Bmp(float g)
    {
    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.bild); 
    Matrix mat = new Matrix();
    mat.postRotate(g);
    Bitmap nbm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mat, false);  
    return nbm;
    }
    
    Funktioniert auch nach mehreren aufrufen. Sieht aber nicht gut aus.

    Neue Code mit Anti Aliasing :
    Code:
    private Bitmap rotate_Bmp(float g)
    {
    Bitmap bmo = BitmapFactory.decodeResource(getResources(), R.drawable.bild).copy(Bitmap.Config.ARGB_8888, true);
    Matrix mt = new Matrix();        
    mt.postRotate(moires,bmo.getWidth()/2,bmo.getHeight()/2);
            
    /*-----*/
    Canvas cv = new Canvas(bmo);
    Paint pn = new Paint();
    pn.setAntiAlias(true);
    pn.setFilterBitmap(true);
    cv.drawBitmap(bmo, mt, pn);
    /*-----*/   
            
    Bitmap nbm = Bitmap.createBitmap(bmo, 0, 0, bmo.getWidth(), bmo.getHeight());
    
    return nbm;
    }
    
    Das rotieren funktioniert, aber nach mehreren aufrufen zeichnet canvas das eine rotierte Bild auf das andere.
     
  4. DieGoldeneMitte, 24.05.2012 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Du malst die Bitmap in sich selbst hinein, das ist natürlich Unsinn.

    Das muss irgendwie so aussen:
    Code:
    Canvas c = new Canvas(a); // ein canvas der in a [B]hinein[/B]malt
    ...
    c.drawBitmap(b,mat,paint); // b soll gemalt werden.
    
    Und wenn man ein neu gedrehtes b malen will, muss man a natürlich vorher aufräumen.
     
    Zuletzt bearbeitet: 24.05.2012
    BFK bedankt sich.
  5. BFK, 24.05.2012 #5
    BFK

    BFK Threadstarter Erfahrener Benutzer

    Beiträge:
    160
    Erhaltene Danke:
    10
    Registriert seit:
    08.12.2010
    Ahh Mist, hast natürlich recht.
    Könnte ich nicht theoritisch in ein neues leeres (also null) Bitamp (Bitmap a) erstellen und da hineinmalen und so mein Bild (Bitmap b) als vorlage benutzen..?

    So etwas meinst du doch oder..?

    EDIT:
    Das hat funktioniert, wobei mein neues Bitmap natürlich nicht null sein darf (bekomme logischerweise ne NullPOinterException).
    Aber man kann auch so ein neues Bitmap definieren..:
    Code:
     Bitmap bmb = Bitmap.createBitmap(bmo.getWidth(), bmo.getHeight(), Bitmap.Config.ARGB_8888); 
    DANKE nochmals für deine Hilfe..!

    -MFG BFK-
     
    Zuletzt bearbeitet: 24.05.2012

Diese Seite empfehlen