我从网络服务动态获取图片。之后我应该用它作为屏幕上半部分的背景。我的问题是我只得到一个尺寸的图像(对于许多智能手机来说应该是大致正确的)但是当我调整它以使其填满屏幕的一半时它会变得像素化。 我已经尝试将它作为容器的背景(添加填充到预期的大小)并使用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
答案 0 :(得分:1)
删除所有操纵图像,需要缩放,缩放等的代码......这都是多余的。你在操作图像时所做的每一次传递都会使它稍微恶化......
您只需要换一行就需要这样做,所以图像永远都是#34;适合"没有裁剪或任何其他变化: imageContainer.getAllStyles()setBackgroundType(Style.BACKGROUND_IMAGE_SCALE_TO_FILL);
请注意,您可以使用ScaleImageLabel
代替图像容器,它可以执行大致相同的操作。