2010-12-17 56 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); 
} 
相關問題