2016-08-04 17 views
2

Ich erhalte ein Bild dynamisch von einem Webservice. Danach sollte ich es als Hintergrund für die obere Hälfte des Bildschirms verwenden. Mein Problem ist, dass ich nur eine Größe des Bildes bekomme (was für viele Smartphone-Smartphones ungefähr richtig sein sollte), aber wenn ich die Größe so ändere, dass sie die Hälfte des Bildschirms ausfüllt, wird sie verpixelt. Ich habe versucht, es als Hintergrund eines Containers (Hinzufügen von Auffüllen zu der erwarteten Größe) und mit BACKGROUND_IMAGE_SCALED_FILL und/oder mit Image-Methoden skaliertHeight/skalierte Breite, füllen und skalieren. Es spielt keine Rolle, wenn ich es zu einer größeren oder kleineren Größe skaliere es verschlechtert sich immer noch merklich.CodeName Eins - Bild wird beim Skalieren pixeliert

Ist das zu erwarten? Gibt es eine andere Möglichkeit, Bilder zu skalieren?

public class CopyOfVistaPantallaPrincipal extends VistaDisparaEventos { 

    private Container canvasPantallaPrincipal; 

    public CopyOfVistaPantallaPrincipal() { 
     canvasPantallaPrincipal = new Container(); 
     canvasPantallaPrincipal.setName("canvasPantallaPrincipal"); 
     super.canvas = this.canvasPantallaPrincipal; 
     initPantallaPrincipal(); 
    } 

    private void initPantallaPrincipal() { 

     canvasPantallaPrincipal.setLayout(new LayeredLayout()); 
     canvasPantallaPrincipal.getUnselectedStyle().setBgTransparency(0); 

     ModeloNovedades modelo = new ModeloNovedades(); 

     Image imgPrincipal = createImagenPrincipal(modelo); 
     canvasPantallaPrincipal.setName("canvas pantalla principal"); 

     Container otro = new Container(new BorderLayout()); 
     if (imgPrincipal != null) { 
      img.getUnselectedStyle().setBorder(null); 
      img.getUnselectedStyle().setPadding(0, 0, 0, 0); 
      img.getUnselectedStyle().setMargin(0, 0, 0, 0); 
      canvasPantallaPrincipal.addComponent(img); 
     } 
     canvasPantallaPrincipal.addComponent(otro); 
    } 

    private Container createImagenPrincipal(ModeloNovedades modelo) { 
     return loadTopImage(modelo, modelo.getDestacado()); 
    } 

    private Container loadTopImage(ModeloNovedades modelo, Hashtable destacado) {  
     int width = Display.getInstance().getDisplayWidth(); 
     int imgHeight = (int) ((Display.getInstance().getDisplayHeight()/2) * 0.95) ; 

     //Default image 
     Image foregroundImage = FormFactory.loadImage("/imagenPrincipaLogoOld.png"); 

     if (! modelo.getDestacado().isEmpty()){ 
      String destacadaURL = "" + destacado.get("imagen"); 
      if (! destacadaURL.equals("")){ 
       //After updating it loads the downloaded image here 
       byte[] data = (byte[]) DataCenter.getInstance().get(destacadaURL, false); 
       foregroundImage = FormFactory.loadImage(data, 100); 
      } 
     } 

     imageContainer.getAllStyles().setPadding(imgHeight/2, imgHeight/2, width/2, width()/2); 
     imageContainer.getAllStyles().setBgImage(foregroundImage); 
     imageContainer.getAllStyles().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FILL); 

     return imageContainer; 
    } 

}

Wenn ich nicht das Bild zurückkehrt, sondern ein Behälter, den er als Hintergrund mit würde ich es zu einem Container wie folgt hinzu:

imageContainer.getAllStyles().setPadding(imgHeight/2, imgHeight/2, width/2, width/2); 
imageContainer.getAllStyles().setBgImage(foregroundImage); 
imageContainer.getAllStyles().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED); //only if it was scaled 

Originalbild (ignorieren Sie bitte die dunkler Balken drüber, es wurde kürzlich hinzugefügt und ich habe die vorherige Version nicht gespeichert, wie ich sagte, es kommt dynamisch): http://i68.tinypic.com/16lmeqr.jpg

Scaled: http://i68.tinypic.com/w7zafm.jpg

Geerntetes: http://i65.tinypic.com/2nkp79l.png

Bild als der letzten Aktualisierung: http://i68.tinypic.com/2ik7eiq.png

+0

Skalierung verschlechtert die Bildqualität. Das ist selbstverständlich. Wenn Sie Code, die tatsächliche Bilddatei und Screenshots bereitstellen, kann ich Ihnen mehr helfen. –

+0

Die angeforderten Informationen hinzugefügt. (Es tut mir leid, wenn dies dazu führt, dass eine doppelte Benachrichtigung erscheint, ich bin mir nicht sicher, wie SO funktioniert) –

Antwort

1

gesamten Code entfernen, der das Bild manipuliert, muss die Skalierung, Umfang etc ... Das ist alles überflüssig ist. Jeder Durchlauf, den Sie bei der Bearbeitung eines Bildes machen, verschlechtert es ein wenig ...

Sie brauchen nur eine Zeile ändern, und Sie müssen es immer tun, damit das Bild immer passt ohne Zuschneiden oder andere Änderungen: imageContainer .getAllStyles(). setBackgroundType (Style.BACKGROUND_IMAGE_SCALE_TO_FILL);

Beachten Sie, dass Sie ScaleImageLabel anstelle des Bildcontainers verwenden können, der ungefähr die gleiche Sache tut.

+0

Ich nehme an, Sie meinen BACKGROUND_IMAGE_SCALED_FILL, da die andere Konstante anscheinend nicht definiert ist. Habe meinen Code in der Frage aktualisiert, ist das was du meintest? Wie im letzten Screenshot gezeigt, wird es immer noch etwas falsch. –

+0

Es ist unklar, aus dem Code, was loadImage tut und wie Sie das Bild herunterladen, das einige Skalierungslogik enthalten könnte. Stellen Sie außerdem sicher, dass der Bildlauf Ihres Simulators aktiviert ist, um eine bessere Darstellung des Bildes auf dem Gerät anzuzeigen, ohne dass der Simulator skaliert und Artefakte enthält. Beachten Sie, dass das Scroll-Flag keine Rolle spielt, wenn Sie die Screenshot-Funktion des Simulators verwenden –