CodeName One - 缩放时图像变为像素化

时间:2016-08-04 16:57:15

标签: image codenameone

我从网络服务动态获取图片。之后我应该用它作为屏幕上半部分的背景。我的问题是我只得到一个尺寸的图像(对于许多智能手机来说应该是大致正确的)但是当我调整它以使其填满屏幕的一半时它会变得像素化。 我已经尝试将它作为容器的背景(添加填充到预期的大小)并使用BACKGROUND_IMAGE_SCALED_FILL和/或使用Image方法scaledHeight / scaledWidth,填充和缩放。 如果我将它缩放到更大或更小的尺寸并不显着,它仍然会明显恶化。

这是预期的吗?还有另一种缩放图像的方法吗?

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

}

如果我没有返回图像,而是将其作为背景的容器,我会将它添加到像这样的容器中:

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 

原始图片(请忽略它上面的暗条,它最近添加了,我没有保存以前的版本,因为我说动态来了): Apps Script Issue Tracker

缩放: http://i68.tinypic.com/16lmeqr.jpg

裁剪: http://i68.tinypic.com/w7zafm.jpg

上次更新时的图片: http://i65.tinypic.com/2nkp79l.png

1 个答案:

答案 0 :(得分:1)

删除所有操纵图像,需要缩放,缩放等的代码......这都是多余的。你在操作图像时所做的每一次传递都会使它稍微恶化......

您只需要换一行就需要这样做,所以图像永远都是#34;适合"没有裁剪或任何其他变化:     imageContainer.getAllStyles()setBackgroundType(Style.BACKGROUND_IMAGE_SCALE_TO_FILL);

请注意,您可以使用ScaleImageLabel代替图像容器,它可以执行大致相同的操作。