2016-08-04 3 views
2

Я получаю изображение динамически из веб-сервиса. Впоследствии я должен использовать его в качестве фона для верхней половины экрана. Моя проблема в том, что я получаю только один размер изображения (что должно быть примерно одинаково для многих телефонов смартфонов), но когда я изменяю его размер, чтобы заполнить половину экрана, он становится неровным. Я попытался поместить его в качестве фона контейнера (добавив отступы в ожидаемый размер) и используя BACKGROUND_IMAGE_SCALED_FILL и/или используя методы изображения scaledHeight/scaledWidth, заполнить и масштабировать. Не имеет значения, если я масштабирую его до большего или меньшего размера, он все равно заметно ухудшается.CodeName One - изображение получает пиксели при масштабировании

Этого можно ожидать? Есть ли другой способ масштабирования изображений?

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 

Оригинал снимка (пожалуйста, игнорировать темный бар над ним, он был добавлен в последнее время, и я не сохранил предыдущую версию, так как я сказал, что она идет динамически): http://i68.tinypic.com/16lmeqr.jpg

Scaled: http://i68.tinypic.com/w7zafm.jpg

Обрезанные: http://i65.tinypic.com/2nkp79l.png

изображение, как последнее обновление: http://i68.tinypic.com/2ik7eiq.png

+0

Масштабирование ухудшит качество изображения. Это данность. Если вы предоставите код, фактический файл изображения и скриншоты, я смогу помочь больше. –

+0

Добавлена ​​запрашиваемая информация. (Прошу прощения, если это вызывает всплывающее двойное уведомление, я не уверен, как работает SO) –

ответ

1

Удалить весь код, который манипулирует изображение, нуждается в масштабировании, масштаб и т.д ... Это все избыточными. Каждый проход, который вы делаете при манипулировании изображением, немного ухудшает его ...

Вам нужно всего лишь одно изменение строки, и вам нужно сделать это всегда, чтобы изображение всегда «подходило» без обрезки или любых других изменений: imageContainer . .getAllStyles() setBackgroundType (Style.BACKGROUND_IMAGE_SCALE_TO_FILL);

Обратите внимание, что вы можете использовать только ScaleImageLabel вместо контейнера изображений, который делает примерно то же самое.

+0

Предполагаю, вы имеете в виду BACKGROUND_IMAGE_SCALED_FILL, поскольку другая константа, похоже, не определена. Обновил мой код в вопросе, это то, что вы имели в виду? Как показано на последнем снимке экрана, он все еще немного ошибочен. –

+0

Непонятно из кода, что делает loadImage и как вы загружаете изображение, которое может включать в себя некоторую масштабирующую логику. Также убедитесь, что ваш симулятор имеет прокрутку, чтобы показать лучшее представление о том, как изображение будет выглядеть на устройстве, без того, чтобы симулятор масштабировал и включал артефакты. Обратите внимание, что если вы используете функцию скриншота симулятора, флаг прокрутки не имеет значения –