Anti Aliasing bei einem Bitmap ..!

B

BFK

Fortgeschrittenes Mitglied
11
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 ..?
 
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.
 
  • Danke
Reaktionen: BFK
DieGoldeneMitte schrieb:
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.

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.
 
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:
  • Danke
Reaktionen: BFK
DieGoldeneMitte schrieb:
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.

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:

Ähnliche Themen

D
Antworten
17
Aufrufe
409
datNeMo
D
M
Antworten
3
Aufrufe
169
moin
M
Y
Antworten
4
Aufrufe
1.227
swa00
swa00
Zurück
Oben Unten