2010-12-17 57 views
0

我有一个代码将图像编码为位图。但我不确定如何在屏幕上显示它。顺便说一下,我正在使用黑莓JavaME。这是我用来编码图像的代码。这是我可以用来从SD卡中获取图像并将其显示在屏幕上的方式吗?有谁知道如何显示一个BitmapField?

FileConnection conn = 
    (FileConnection)Connector.open("image1.png",Connector.READ_WRITE); 
if(conn.exists()) { 
    InputStream is = conn.openInputStream(); 
    BitmapField bitmap = null; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    int ch; 
    while ((ch = is.read()) != -1) 
    { 
     baos.write(ch); 
    } 
    byte imageData[] = baos.toByteArray(); 
    bitmap = new BitmapField(
     EncodedImage.createEncodedImage(imageData, 0, imageData.length).getBitmap()); 
    add(bitmap); 
} 
+0

下面是一些我想到的代码:我假设“image1.png”只是一个实际URI的占位符,例如, “文件:///store/home/pictures/image1.png”;如果Bitmap与应用程序打包在一起,则使用Bitmap.getBitmapResource,如果它位于文件系统上,则使用FileConnection但使用真实路径。如果在添加位图后立即添加其他字段,您是否可以看到该字段?你确定图像是一个有效的位图吗?您可以使用Bitmap.createBitmapFromBytes()而不是EncodedImage中的方法并节省一些空间。 – Jonathan 2010-12-17 03:37:15

+0

如何在文件连接中添加真实路径? FileConnection conn =(FileConnection)Connector.open(“file:/// SDCard/BlackBerry/documents /”+“image1.png”,Connector.READ_WRITE); – JohnDoe4136 2010-12-17 06:46:51

+0

这看起来像一个有效的路径,现在只要确保那里有一个图像。你不需要使用READ_WRITE,因为你只是想读取图像。 – Jonathan 2010-12-17 14:40:18

回答

3

Secko是正确的,你可以覆盖的油漆,但我认为你是被卡住,因为你还没有创建一个用户界面应用程序。

这是一个非常简单的ui应用程序示例,用于显示位图字段,如果您完全复制它,则需要在src下带有image.png的图像文件夹。

这是从SDK附带的HelloWorldDemo中修改而来的。我建议,如果你刚开始,你看看文件夹中的样本。 \插件\ net.rim.ejde.componentpack5.0.0_5.0.0.25 \分量\样本\

好运

public class DisplayBitmaps extends UiApplication 
{ 
    public static void main(String[] args) 
    { 
     DisplayBitmaps theApp = new DisplayBitmaps();  
     theApp.enterEventDispatcher(); 
    } 

    public DisplayBitmaps() 
    {   
     pushScreen(new DisplayBitmapsScreen()); 
    }  
} 

final class DisplayBitmapsScreen extends MainScreen 
{ 
    DisplayBitmapsScreen() 
    {  
    Bitmap bitmap = EncodedImage.getEncodedImageResource("images/image.png").getBitmap(); 
    BitmapField bitmapField = new BitmapField(bitmap); 
     add(bitmapField); 
    } 

    public void close() 
    { 
     super.close(); 
    } 
} 

编辑为当图像上的SD卡

DisplayBitmapsScreen() 
{  
//Bitmap bitmap = EncodedImage.getEncodedImageResource("images/image.png").getBitmap(); 
try { 
    FileConnection fc = (FileConnection) Connector.open("file:///SDCard/BlackBerry/pictures/image.png"); 
    if (fc.exists()) { 
    byte[] image = new byte[(int) fc.fileSize()]; 
    InputStream inStream = fc.openInputStream(); 
    inStream.read(image); 
    inStream.close(); 
    EncodedImage encodedImage = EncodedImage.createEncodedImage(image, 0, -1); 
    BitmapField bitmapField = new BitmapField(encodedImage.getBitmap()); 
    fc.close(); 
    add(bitmapField); 
    } 
} catch (Exception e) { System.out.println("EXCEPTION " + e); } 
} 

重写油漆在现场或任何扩展Field类也可以显示图像,但我并没有真正从Secko的例子明白的地方,他会显示图像所以我在下面的例子中包含了drawImage。

protected void paint(Graphics graphics) { 
    graphics.drawImage(x, y, width, height, image, frameIndex, left, top); 
    super.paint(graphics); 
} 
+0

如果我试图从SD卡上获取图像,这是否工作? – JohnDoe4136 2010-12-17 06:44:41

+0

我已经为SDd卡上的图像添加了一个示例。模拟器的一个怪癖是检测sdcard,你可能会注意到当你第一次运行应用程序时,图像没有加载,但第二次运行。对于这个我建议看看http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/1295814/How_To_-_Programmatically_determine_if_a_microSD_card_has_been_inserted.html?nodeid=1295868&vernum=0 – 2010-12-17 08:25:11

+0

当我到这部分bitmap = image.getBitmap();它会给我一个Uncaught:IllegalArgumentException。为什么这样? – JohnDoe4136 2010-12-24 03:55:31

0

你可以做到这一点:

油漆(图形G);

也许在一个函数:

protected void DrawStuff(Graphics g) {    
    this.paint(g); 
}