2016-08-30 4 views
2

Ich habe ein Watch Face für Android Wear gemacht.
Aber das Problem ist die Bildskalierung. Bilder für Hintergrund, Marker und Gadgets sind von reduzierter Qualität, wenn ich ihre Größe ändere.Bitmap-Skala zerstören Qualität

Zum Beispiel habe ich 480x480 Hintergrundbild in ziehbar-nodpi Ordner (ich habe andere dpi als auch versucht), und ich rescale es wie folgt aus:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = true; 
Bitmap bgImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.ticks_1, options); 
bgImage = Bitmap.createScaledBitmap(bgImage , width, height, false); 

Hier sind die Bilder:

background enter image description here

und das ist, was ich auf die Uhr bekommen:

screenshot

Mache ich etwas falsch mit der Größenanpassung oder was?

Antwort

2

Ich habe eine Lösung gefunden here und es funktioniert super.
Hier ist der Teil des Codes für die Bildskalierung:

public Bitmap getResizedBitmap(Bitmap bitmap, int newWidth, int newHeight) { 
     Bitmap resizedBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); 

     float scaleX = newWidth/(float) bitmap.getWidth(); 
     float scaleY = newHeight/(float) bitmap.getHeight(); 
     float pivotX = 0; 
     float pivotY = 0; 

     Matrix scaleMatrix = new Matrix(); 
     scaleMatrix.setScale(scaleX, scaleY, pivotX, pivotY); 

     Canvas canvas = new Canvas(resizedBitmap); 
     canvas.setMatrix(scaleMatrix); 
     canvas.drawBitmap(bitmap, 0, 0, new Paint(Paint.FILTER_BITMAP_FLAG)); 

     return resizedBitmap; 
    } 
+0

Schön. +1. Interessiert zu sehen, wie der finale Bildschirm jetzt aussieht mit diesem Code :) – Doomsknight

+0

Das war nur ein Testbild. Ich entwickle ein Zifferblatt mit mehr Funktionen und Aussehen. Dieses blaue Bild mit Kreisen war wie das obere ohne Verzerrung und Verpixelung. – filipst

+0

Wenn Sie Ihre letzte fertig sind, senden Sie uns einen Link :) – Doomsknight

2

Ein paar Kommentare zum folgenden Code. Der Optionsbereich Ihrer Dekodierung macht nichts, da keine Stichprobengröße eingestellt ist. So kann es entfernt werden.

Ich denke, das Problem mit Ihrer Bildverzerrung, ist in der Tat das Bild selbst. Wenn Sie die Größe ändern, beträgt der Wert 75%. Es ist einfach nicht in der Lage, die Größe zu ändern, während das Bild genau gleich aussieht. Die Bänder sind so dünn, dass jede leichte Abweichung dazu führt, dass sie anders erscheint.

Ich schlage vor, es mit dickeren Ringen zu versuchen. Und sehen Sie, ob das Bild verzerrt ist oder nicht. Auch nur als schnelle Prüfung oder dauerhafte Lösung.

Update:

auf halten Bilder erweitern knackigen bei allen Auflösungen klar, schauen Sie in VECTOR Bilder. Diese sind bei allen Auflösungen pixelgenau und würden auf allen Uhren eine fantastische Grafik präsentieren. Vor allem, da Sie grundlegende Formen verwenden, sollte es leicht zu erreichen sein.

Wenn Sie die Größe von Bitmaps ändern, können Sie Unschärfe erwarten, wenn das Bild neu gezeichnet wird. Wenn es sich um eine Bitmap handelt, fügen Sie mehrere Auflösungen in die verschiedenen dpi-Ordner ein, damit Android diese entsprechend auswählt.

+0

ich mit nur einem schwarzen Kreis auf sich ein Bild hatte, und wieder bekam ich schlechte Qualität. Ich verstehe es nicht, wie machen andere Leute die Gesichter mit vielen Grafiken in ihnen. – filipst

+0

@filipst Siehe bearbeiten. Wenn Sie gute Qualität haben möchten, sollten Sie Vektorbilder für geometrische Grundformen verwenden. Ich dachte, dass deine Frage darauf abzielte, wie das Bild durch mangelnde Qualität verzerrt wurde, anstatt durch Schärfe. [Einige Infos hier] (https://developer.android.com/training/material/drawables.html) – Doomsknight

+0

Ich werde das versuchen. Aber denkst du, dass diese Uhr zum Beispiel programmgesteuert gezeichnet wird? https://play.google.com/store/apps/details?id=com.denite.watchface.blackmetal – filipst

0

ändern

bgImage = Bitmap.createScaledBitmap(bgImage , width, height, false); 

zu

bgImage = Bitmap.createScaledBitmap(bgImage , width, height, true); 

Dies wird einfach bilineare Interpolation anzuwenden. Das Ergebnis ist ein etwas unscharfes Bild, da die Kreise so dünn sind, aber es wird mehr Informationen geben, um ein skaliertes Bild zu erzeugen. Das erstellte Bild hat auch ein Moiré-Muster, ist aber weniger verzerrt als in Ihrem Beispielbild. Wenn Sie das Bild in Photoshop mithilfe der Bicubic-Filterung verkleinern, erhalten Sie die besten Ergebnisse, aber auch dann, wenn Vektorgrafiken verwendet werden, werden alle Bitmap-basierten Arbeiten, wie sie Doomsknight vorgeschlagen hat, übertroffen.