2016-06-09 14 views
1

Die Frage ist im Titel. Zum Beispiel, wie kann ich g in einer Datei im folgenden Snippet speichern?Gibt es eine Möglichkeit, ein Graphics-Objekt in Codename One zu speichern, ohne einen Screenshot zu erstellen?

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

// NOW how can I save g in a file ? 

} 

Die reaseon warum ich will nicht einen Screenshot nehmen, weil ich die volle Auflösung von g (zB: 2000 x 1500) behalten will.

Ich wäre jedem dankbar, der mir sagen kann, wie man das mit Codename 1 macht. Wenn nicht möglich, dann ist es schon gut, es zu wissen!

Cheers,

Antwort

2

Sie können ein Bild als Puffer erstellen, das Grafikobjekt aus dem Bild holen und alle Ihre Zeichnungsoperationen darauf ausführen. Dann ziehen das ganze Bild auf dem Display und speichern Sie es als Datei:

int height = 2000; 
int width = 1500; 
float saveQuality = 0.7f; 

// Create image as buffer 
Image imageBuffer = Image.createImage(width, height, 0xffffff); 
// Create graphics out of image object 
Graphics imageGraphics = imageBuffer.getGraphics(); 

// Do your drawing operations on the graphics from the image 
imageGraphics.drawWhaterver(...); 

// Draw the complete image on your Graphics object g (the screen I guess) 
g.drawImage(imageBuffer, w, h); 

// Save the image with the ImageIO class 
OutputStream os = Storage.getInstance().createOutputStream("storagefilename.png"); 
ImageIO.getImageIO().save(imageBuffer, os, ImageIO.FORMAT_PNG, saveQuality); 

Beachten Sie, dass ich es nicht getestet, aber es sollte so funktionieren.

+0

Danke das funktioniert wie erwartet !!! Die Ausgabebilddatei hat die gleichen Abmessungen wie das Originalbild! Aber warum hat die Methode, die ich benutzt habe, nicht funktioniert? Der einzige Unterschied zu Ihrem ist, dass Sie ein Zwischenbild als Puffer verwenden, während ich direkt auf das Graphics-Objekt g zeichnete. Vielen Dank im Voraus, wenn Sie oder vielleicht @Shai einige Erklärungen hinzufügen können. – HelloWorld

1

Graphics nur ein Proxy auf eine Oberfläche ist, hat sie keine Kenntnis oder den Zugriff auf die darunter liegende Oberfläche, auf die sie zieht, und der Grund dafür ist ganz einfach. Es kann auf eine hardwarebeschleunigte "Oberfläche" zurückgreifen, wo physikalisch kein darunter liegendes Bild vorhanden ist.

Dies ist sowohl bei iOS als auch bei Android der Fall, wo der "Bildschirm" nativ gezeichnet wird und keinen Puffer hat.

+0

Danke @Shai, also wenn es keinen Puffer gibt, ist es nicht möglich, die Grafiken in einer Datei zu speichern. Folglich ist screenshot mein einziger Weg zu gehen! – HelloWorld