2016-06-07 8 views
1

Мой вопрос связан с this previous question. То, что я хочу достичь, это стекирование изображений (они имеют прозрачность), запись строки сверху и сохранение фотомонтажа/фотоколлажа с полным разрешением.Возможно ли сохранить сгенерированное изображение в Codename One?

@Override 
protected void beforeMain(Form f) { 


    Image photoBase = fetchResourceFile().getImage("Voiture_4_3.jpg"); 
    Image watermark = fetchResourceFile().getImage("Watermark.png"); 


    f.setLayout(new LayeredLayout()); 
    final Label drawing = new Label(); 
    f.addComponent(drawing); 


    // Image mutable dans laquelle on va dessiner (fond blanc) 
    Image mutableImage = Image.createImage(photoBase.getWidth(), photoBase.getHeight()); 
    drawing.getUnselectedStyle().setBgImage(mutableImage); 
    drawing.getUnselectedStyle().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT); 

    // Paint all the stuff 
    paints(mutableImage.getGraphics(), photoBase, watermark, photoBase.getWidth(), photoBase.getHeight()); 

    // Save the collage 
    Image screenshot = Image.createImage(photoBase.getWidth(), photoBase.getHeight()); 
    f.revalidate(); 
    f.setVisible(true); 
    drawing.paintComponent(screenshot.getGraphics(), true); 

    String imageFile = FileSystemStorage.getInstance().getAppHomePath() + "screenshot.png"; 
    try(OutputStream os = FileSystemStorage.getInstance().openOutputStream(imageFile)) { 
     ImageIO.getImageIO().save(screenshot, os, ImageIO.FORMAT_PNG, 1); 
    } catch(IOException err) { 
     err.printStackTrace(); 
    } 

} 

public void paints(Graphics g, Image background, Image watermark, int width, int height) { 

    g.drawImage(background, 0, 0); 
    g.drawImage(watermark, 0, 0); 
    g.setColor(0xFF0000); 

    // Upper left corner 
    g.fillRect(0, 0, 10, 10); 

    // Lower right corner 
    g.setColor(0x00FF00); 
    g.fillRect(width - 10, height - 10, 10, 10); 

    g.setColor(0xFF0000); 
    Font f = Font.createTrueTypeFont("Geometos", "Geometos.ttf").derive(220, Font.STYLE_BOLD); 
    g.setFont(f); 
    // Draw a string right below the M from Mercedes on the car windscreen (measured in Gimp) 
    g.drawString("HelloWorld", 
      (int) (848), 
      (int) (610) 
      ); 

} 

Это сохраненная скриншот я получаю, если я использую Iphone6 ​​кожи Screenshot I get (полезная нагрузка изображения меньше, чем оригинал и по центру). Если я использую скин Xoom, это то, что я получаю Screenshot I get with Xoom (изображение полезной нагрузки по-прежнему меньше исходного изображения, но оно перемещено влево).

Итак, чтобы подвести итог: почему сохраненный снимок экрана с кожей Xoom отличается от той, которую я получаю с кожей Iphone? Есть ли в любом случае возможность сохранить графику, на которой я рисую в методе paintts, чтобы у сохраненного изображения были оригинальные размеры?

Большое спасибо всем, кто мог мне помочь :-)!

Приветствия,

+0

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

+0

@Shai Правый предыдущий пост слишком длинный. Вы рекомендуете отредактировать его и сделать его KISS? – HelloWorld

+0

Я рекомендую писать несколько меньших вопросов в будущем. –

ответ

1

Вы можете сохранить изображение в Codename одном используя ImageIO класс. Обратите внимание, что вы можете нарисовать иерархию контейнеров в изменяемое изображение с использованием метода paintComponent(Graphics).

Вы можете сделать оба подхода с рисованием изображения на изменяемом или с помощью макетов. Лично я всегда предпочитаю макеты, поскольку мне нравится абстракция, но я бы не сказал, что подход с изменчивым изображением правильный/неправильный.

Обратите внимание, что если вы меняете/перекрашиваете много, то изменяемые изображения медленнее (это не будет заметно для обычного кода или симулятора), поскольку они вынуждены использовать средство визуализации программного обеспечения и не могут полностью использовать GPU.

В предыдущем вопросе кажется, что вы поместили изображение с стилем «FIT», который, естественно, нарисовал его меньше, чем содержащий контейнер, а затем нарисовал изображение поверх него вручную ... Это проблематично.

Одним из решений является рисование всего вручную, но тогда вам нужно будет сделать «подходящий» аспект рисования самостоятельно. Если вы используете макеты, вы должны поместить все на основе макетов, включая рисунок/текст.

+0

Спасибо за ваш путеводитель! Я попытаюсь использовать измененное изображение, чтобы результат имел то же разрешение, что и исходное изображение, которое будет поступать с камеры. Как только я получу что-то, я отправлю код, который я использую. – HelloWorld

+0

Это может быть тривиальное @Shai, но что вы подразумеваете под «вручную»? Примером было бы здорово, если это было возможно! – HelloWorld

+0

Когда я говорю вручную, я имею в виду использование drawString, drawImage и т. Д., Как вы делали непосредственно на графике, а не paintComponent. –

 Смежные вопросы

  • Нет связанных вопросов^_^