2016-08-24 59 views
1

我试图从URL使用URLImage.createToStorage拉图像。不过,我希望该图片看起来四舍五入,以便为图片添加遮罩。但是,当我运行标签时只显示占位符图像,而不是url图像。当我注释掉将圆角蒙版添加到图像显示图像的代码时。我的圆形图像代码有问题吗?我使用Display.getInstance()。callSerially()。Codename one rounded URLImage not display

//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; 
} 

setUpProfile()方法在Form的beforeShow中调用。

编辑:我编辑了使用URLImage.createMaskAdapter的工作setUpProfile()方法。并实现圆润的图像。

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()); 
} 

回答

1

您可以通过创建一个自定义ImageAdapter为你自​​动生成round-mask在下载图像实现这一目标。

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; 
    } 
}; 

然后应用这种方式:

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

你可以用'URLImage.createMaskAdapter()'这还要快。原始代码不起作用的原因是掩码有效地替换了图像。所以他创建了一个'URLImage',并且在它有机会获取数据之前,他用新的蒙版图像替换了它...... –

+0

@ShaiAlmog我在使用URLImage.createMaskAdapter的新代码中进行了编辑。图像现在正在出现,但它不是圆形的。它仍然是一个正方形。 – Kyri33

+0

删除主目录中的.cn1目录的内容,然后再试一次 –