2016-08-24 1 views
1

Je tente de tirer une image à partir d'une URL en utilisant URLImage.createToStorage. Cependant, je veux que cette image apparaisse arrondie, donc j'ajoute un masque à l'image. Cependant, lorsque je cours l'étiquette affiche seulement l'image de l'espace réservé, pas l'image de l'URL. Lorsque je commente le code qui ajoute le masque arrondi à l'image que l'image affiche. Y at-il quelque chose qui ne va pas avec mon code d'image arrondi. J'ai utilisé Display.getInstance(). CallSerially().Codename un arrondi URLImage ne pas afficher

//Where I display the image. 
public void setUpProfile(Form f) { 
    Label imageLabel = findMyImage(f); 
    Image img = getImageFromRes("myprofile.png"); 
    Image scaled = img.scaledWidth(f.getWidth()/2); 
    EncodedImage enc = EncodedImage.createFromImage(scaled, false); 

    Display.getInstance().callSerially(new Runnable() { 
     @Override 
     public void run() { 
      imageLabel.setIcon(getRoundedImage(URLImage.createToStorage(enc, 
      "profileImage8", me.getPicture(), URLImage.RESIZE_SCALE_TO_FILL))); 
      f.revalidate(); 
     } 
    }); 

    findProfNameLabel(f).setText(me.getName()); 
    findProfAgeLabel(f).setText(me.getAge() + " Years old"); 
    findProfPrefLabel(f).setText("Interested in " + me.getPref()); 
} 

public Image getRoundedImage(Image img) { 

    int w = img.getWidth(); 
    int h = img.getHeight(); 

    Image maskImage = Image.createImage(w, h); 
    Graphics g = maskImage.getGraphics(); 
    g.setColor(0xffffff); 
    g.fillArc(0, 0, w, h, 0, 360); 

    Object mask = maskImage.createMask(); 
    Image ret = img.applyMask(mask); 
    return ret; 
} 

La méthode setUpProfile() est appelée dans le beforeShow du formulaire.

EDIT: J'ai modifié dans la méthode setUpProfile() qui utilise URLImage.createMaskAdapter. et réalise une image arrondie.

public void setUpProfile(Form f) { 
    Label imageLabel = findMyImage(f); 
    Image mask = getImageFromRes("rounded-mask.png"); 
    Image placeholder = getImageFromRes("myprofile.png").scaled(mask.getWidth(), mask.getHeight()); 
    EncodedImage enc = EncodedImage.createFromImage(placeholder.applyMask(mask.createMask()), 
false); 
    System.out.println("SetUpProfile picture " + me.getPicture()); 

    imageLabel.setIcon(URLImage.createToStorage(enc, "profileImage8", 
    me.getPicture(), URLImage.createMaskAdapter(mask))); 

    findProfNameLabel(f).setText(me.getName()); 
    findProfAgeLabel(f).setText(me.getAge() + " Years old"); 
    findProfPrefLabel(f).setText("Interested in " + me.getPref()); 
} 

Répondre

1

Vous pouvez y parvenir en créant une coutume ImageAdapter qui génère un round-mask automatiquement pour vous lors du téléchargement de l'image.

public static final URLImage.ImageAdapter RESIZE_SCALE_WITH_ROUND_MASK = new URLImage.ImageAdapter() { 
    @Override 
    public EncodedImage adaptImage(EncodedImage downloadedImage, EncodedImage placeholderImage) { 
     Image tmp = downloadedImage.scaledLargerRatio(placeholderImage.getWidth(), placeholderImage.getHeight()); 
     if (tmp.getWidth() > placeholderImage.getWidth()) { 
      int diff = tmp.getWidth() - placeholderImage.getWidth(); 
      int x = diff/2; 
      tmp = tmp.subImage(x, 0, placeholderImage.getWidth(), placeholderImage.getHeight(), true); 
     } else if (tmp.getHeight() > placeholderImage.getHeight()) { 
      int diff = tmp.getHeight() - placeholderImage.getHeight(); 
      int y = diff/2; 
      tmp = tmp.subImage(0, y, Math.min(placeholderImage.getWidth(), tmp.getWidth()), 
        Math.min(placeholderImage.getHeight(), tmp.getHeight()), true); 
     } 
     Image roundMask = Image.createImage(tmp.getWidth(), tmp.getHeight(), 0xff000000); 
     Graphics gr = roundMask.getGraphics(); 
     gr.setColor(0xffffff); 
     gr.fillArc(0, 0, tmp.getWidth(), tmp.getHeight(), 0, 360); 
     Object mask = roundMask.createMask(); 
     tmp = tmp.applyMask(mask); 
     return EncodedImage.createFromImage(tmp, false); 
    } 

    @Override 
    public boolean isAsyncAdapter() { 
     return true; 
    } 
}; 

Appliquer ensuite cette façon:

public void setUpProfile(Form f) { 
    Label imageLabel = findMyImage(f); 
    Image img = getImageFromRes("myprofile.png"); 
    Image scaled = img.scaledWidth(f.getWidth()/2); 
    EncodedImage enc = EncodedImage.createFromImage(scaled, false); 

    Display.getInstance().callSerially(new Runnable() { 
     @Override 
     public void run() { 
      imageLabel.setIcon(URLImage.createToStorage(enc, 
      "profileImage8", me.getPicture(), RESIZE_SCALE_WITH_ROUND_MASK)); 
      f.revalidate(); 
     } 
    }); 

    findProfNameLabel(f).setText(me.getName()); 
    findProfAgeLabel(f).setText(me.getAge() + " Years old"); 
    findProfPrefLabel(f).setText("Interested in " + me.getPref()); 
} 
+1

Vous pouvez utiliser 'URLImage.createMaskAdapter()' qui est encore plus rapide. La raison pour laquelle le code d'origine ne fonctionne pas est que le masquage remplace efficacement l'image. Donc, il crée un URLImage et avant qu'il ait une chance de récupérer les données, il le remplace par la nouvelle image masquée ... –

+0

@ShaiAlmog J'ai édité dans mon nouveau code qui utilise l'URLImage.createMaskAdapter. L'image apparaît maintenant mais elle n'est pas arrondie. C'est toujours un carré. – Kyri33

+0

Supprimez le contenu du répertoire .cn1 dans votre répertoire personnel et réessayez. –