Qualitätsverlust einer PNG beim Transportieren auf ein Android-Phone

V

Vaio

Neues Mitglied
0
Hi,
ich habe mir in Gimp ein Bild als Hintergrund für meine SurfaceView erstellt; im Grunde genommen ein Farbvelauf mit etwas Rauschen (eigentlich nicht wirklich sichtbar!). Diese Png zeichne ich dann als Bitmap auf die Canvas der SurfaceView. Funktioniert soweit; allerdings besteht ein gewaltiger Unterschied in der Qualität der Bilder, so sind auf meinem Handy einzelne breite Ringe sichtbar, das Rauschen ist stark sichtbar und außerdem ist der Farbverlauf teilweise grünlich. Das selbe Bild sieht in der Android-Gallerie schon besser aus (keine Ringe, keine grüne Farbe, allerdings immernoch sichtbares Rauschen). Ich wollte eigentlich ein Screenshot der SurfaceView hochladen, nur sieht selbiger auf dem PC fast wieder wie das Original aus??? Wie bekomme ich die Png denn möglichst ohne solche Qualitätsverluste in meine SurfaceView?
Im Anhang das Original...
MfG Vaio
PS: Ich besitze ein Galaxy SIII
 

Anhänge

  • background_classic.png
    background_classic.png
    107,2 KB · Aufrufe: 13.716
Wie liest du die png Datei ein? Dithering oder eine falsche Config wird dein Problem sein. Probier mal das folgende Snippet aus:

Code:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image, options);

Es empfiehlt sich auch stark (gerade Übergänge und Verläufe) als .xml Datei anzulegen. Spart wesentlich Platz. Nachteil: dein Rauschen wäre weg. Drawable Resources | Android Developers
 
Zuletzt bearbeitet:
Hmm, also mit deinem Snippet war die Qualität jetzt auch nicht sonderlich besser, evtl liegt es am Farbchannel von Android... Naja, ich habe mich mal an der Implementation via Drawable versucht und habe dazu noch eine dumme Frage: Wie soll ich das Drawable denn jetzt in meine Canvas zeichnen ? :D

MfG Vaio
 
Was meinst du mit Farbchannel? In der Konfiguration hast du das maximale drin, was Android bietet. Jeder Kanal hat pro Pixel 8 Bit. Speicherst du das Bild vorher in 64 oder sogar 128 Bit ab?!

Bei deiner zweiten Frage einfach mal suchen: android - Drawable image on a canvas - Stack Overflow
 
Das habe ich schon so ausprobiert. Allerdings wird beim Zeichnen der Bitmap die folgende Fehlermeldung geworfen:
Code:
NullPointerException
at android.graphics.canvas.throwIfRecycled(Canvas.java:1025)
at ...canvas.drawBitmap(Canvas.java:1065
Die Bitmap lade ich so:
Code:
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.background);
,
wobei das Shape in der Datei background.xml gespeichert ist.
 
Hast du die Bitmap vorher recycled? Sehr wahrscheinlich ist das der Fall...
 
Diesbezüglich hatte ich extra nochmal den SourceCode durchsuchen lassen. Und außer dem Laden, dem Zeichnen und der Deklaration gibt es nichts. Und da das Laden in der OnCreate-Methode geschieht sollte eigentlich ausgeschlossen sein, dass die Bitmap recycelt wurde. Außer das Laden an sich hätte nicht funktioniert, warum auch immer ... Kann es eventuell an dem XML-File selber liegen ?
Code:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <gradient
        android:startColor="#FFFF0000"
        android:endColor="#80FF00FF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />

    

</shape>
 
Deine XML Datei schaut gut aus. Ich weiß ehrlich gesagtnun nicht, wo dein Problem liegen soll. Ich rate ja bereits ins Blaue. Schau dir das nochmal an. Besonders das Snippet beim ShapeDrawable könnte dir helfen: Canvas and Drawables | Android Developers
 
Also mit folgendem Code gibt es keine Fehlermeldung mehr, allerdings bleibt der Hintergrund schwarz. Irgendwas scheint also immer noch nicht zu funktionieren:
Code:
private Drawable background;
...
background = getResources().getDrawable(R.drawable.background);
...
background.draw(canvas);
 
Ok, scheinbar habe ich jetzt den Fehlerursprung gefunden. Meine statische Funktion zum Laden der Bitmap funktioniert nicht (warum dass jetzt so ist, weis ich nicht. Evtl weil static ??) . Sieht folgender Maßen aus:
Code:
public static Bitmap getBitmapFromRessource(Context context, int ID){
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), ID);
        if(bitmap == null)
            throw new RuntimeException("error loading bitmap ");
        return bitmap;
    }

Die RuntimeException habe ich jetzt erst hinzugefügt. Was ich seltsam finde ist, dass das ja eigentlich die einfachste gängige Methode ist ...?
 

Ähnliche Themen

B
Antworten
4
Aufrufe
496
bb321
B
D
  • Data2006
Antworten
14
Aufrufe
487
jogimuc
J
M
Antworten
4
Aufrufe
1.173
swa00
swa00
Zurück
Oben Unten