【问题标题】:Codename one rounded URLImage not displaying代号一舍入 URLImage 不显示
【发布时间】:2016-08-30 03:15:50
【问题描述】:

我正在尝试使用 URLImage.createToStorage 从 url 中提取图像。但是我希望那张图片看起来是圆形的,所以我在图像中添加了一个蒙版。但是,当我运行标签时,只显示占位符图像,而不是 url 图像。当我注释掉将圆形遮罩添加到图像显示的图像的代码时。我的圆形图像代码有问题吗?我使用了 Display.getInstance().callSerially()。

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

【问题讨论】:

    标签: java image codenameone mask


    【解决方案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());
    }
    

    【讨论】:

    • 您可以使用更快的URLImage.createMaskAdapter()。原始代码不起作用的原因是掩蔽有效地替换了图像。所以他创建了一个URLImage,在它有机会获取数据之前,他用新的蒙版图像替换了它......
    • @ShaiAlmog 我在使用 URLImage.createMaskAdapter 的新代码中进行了编辑。图像现在出现,但不是圆形的。它仍然是一个正方形。
    • 删除你家目录下.cn1目录的内容再试一次
    • @ShaiAlmog 我删除了内容并运行了,但图像仍然不圆。
    • @ShaiAlmog 它正在工作我更改了图像 ID。方形图像显然被缓存了。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多