2016-08-24 62 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目錄的內容,然後再試一次 –