2016-06-09 46 views
1

问题在标题中。例如,如何在下面的代码片段中将g保存在文件中?有没有办法在没有截图的情况下在Codename One中保存Graphics对象?

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 ? 

} 

为什么我不想截取屏幕截图是因为我想保留g的完整分辨率(例如:2000 x 1500)。

我会非常感谢任何能告诉我如何使用Codename来做到这一点的人。如果不可能,那么知道它就已经很好了!

干杯,

回答

2

你可以做的是创建一个图像作为缓冲区,从图像中获取图形对象,并做所有的图形操作。然后整个图像绘制到显示器并把它保存为一个文件:

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

请注意,我没有测试它,但它应该工作那样。

+0

谢谢,这是预期的工作!输出图像文件具有与原始图像相同的尺寸!但为什么我使用的方法不起作用?与你唯一的区别是,你使用中间图像作为缓冲区,而我直接画在图形对象克。在此先感谢您或者@Shai可以添加一些解释。 – HelloWorld

1

图形仅仅是一个代理到表面,它没有任何知识或访问底层的表面,它是绘画和其中的原因很简单。它可以绘制到物理上没有底层图像的硬件加速“表面”。

在iOS和Android上,“屏幕”本地绘制且没有缓冲区的情况都是如此。

+0

谢谢@Shai,所以如果没有缓冲区,将无法将图形保存在文件中。因此,截图是我唯一的出路! – HelloWorld

相关问题