2016-06-07 16 views
1

Meine Frage bezieht sich auf this previous question. Was ich erreichen möchte, ist das Stapeln von Bildern (sie haben Transparenz), das Schreiben eines Strings und das Speichern der Fotomontage/Fotocollage mit voller Auflösung.Kann ein generiertes Bild in Codename One gespeichert werden?

@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) 
      ); 

} 

Dies ist die gespeicherten Screenshot ich, wenn ich die Iphone6 ​​Haut Screenshot I get verwenden (die Nutzlast ist kleiner als das Original und ist zentriert). Wenn ich den Xoom-Skin benutze, bekomme ich Screenshot I get with Xoom (das Payload-Bild ist immer noch kleiner als das Originalbild, aber es ist nach links gerückt).

Um alles zusammenzufassen: Warum unterscheidet sich der gespeicherte Screenshot mit Xoom Haut von dem, den ich mit Iphone Haut bekomme? Gibt es überhaupt eine Möglichkeit, die Grafik, auf der ich in der LOLS-Methode male, direkt zu speichern, damit das gespeicherte Bild die ursprünglichen Abmessungen hat?

Vielen Dank an alle, die mir helfen könnten :-)!

Cheers,

+0

Es ist ein bisschen schwer für mich, der vorherigen Frage zu folgen, da sie sehr lang ist. Ich empfehle, Fragen auf kleinere Einzelfragen zu reduzieren, um bessere Antworten zu erhalten. Fühlen Sie sich frei, so viele Fragen zu stellen, wie Sie möchten, solange sie gut formuliert/recherchiert sind. –

+0

@Shai Richtig, der vorherige Beitrag ist zu lang. Empfiehlst du es zu bearbeiten und es KISS zu machen? – HelloWorld

+0

Ich empfehle in Zukunft mehrere kleinere Fragen zu schreiben. –

Antwort

1

Sie ein Bild in Codenamen speichern kann man die ImageIO Klasse. Beachten Sie, dass Sie eine Containerhierarchie mithilfe der Methode paintComponent(Graphics) in ein veränderbares Bild zeichnen können.

Sie können beide Ansätze mit Draw Image auf veränderbare oder über Layouts tun. Persönlich bevorzuge ich Layouts, wie ich die Abstraktion mag, aber ich würde nicht sagen, dass der Ansatz des veränderbaren Bildes richtig/falsch ist.

Beachten Sie, dass veränderbare Bilder langsamer sind (dies ist für normalen Code oder im Simulator nicht erkennbar), da sie gezwungen sind, den Software-Renderer zu verwenden und die GPU nicht vollständig verwenden können.

In der vorherigen Frage scheint es, dass Sie das Bild mit einem "FIT" -Stil platziert haben, der es natürlich kleiner gezeichnet hat als den enthaltenen Container und dann das Bild manuell darauf gezeichnet hat ... Das ist problematisch.

Eine Lösung ist, alles manuell zu zeichnen, aber dann müssen Sie den "Fit" -Abschnitt der Zeichnung selbst machen. Wenn Sie Layouts verwenden, sollten Sie alles basierend auf den Layouts einschließlich Ihrer Zeichnung/Ihres Textes positionieren.

+0

danke für Ihren Guide! Ich werde versuchen, ein veränderbares Bild zu zeichnen, so dass das Ergebnis die gleiche Auflösung hat wie das Originalbild, das von der Kamera kommt. Sobald ich etwas bekomme, poste ich den Code, den ich benutze. – HelloWorld

+0

Es kann trivial @Shai sein, aber was meinst du mit "manuell"? Ein Beispiel wäre großartig, wenn immer möglich! – HelloWorld

+0

Wenn ich manuell sage, meine ich die Verwendung von drawString, drawImage usw., wie Sie es direkt in der Grafik getan haben, im Gegensatz zu paintComponent. –

Verwandte Themen