2011-04-11 90 views
6

我正在從網絡讀取原始圖像。該圖像已被圖像傳感器讀取,而不是來自文件。如何從原始圖像獲取位圖

這些是我知道關於圖像的東西:
〜高度&寬度
〜總大小(以字節計)
〜8位灰度
〜1字節/象素

我試圖將此圖像轉換爲位圖以在圖像視圖中顯示。

這裏是我的嘗試:

BitmapFactory.Options opt = new BitmapFactory.Options(); 
opt.outHeight = shortHeight; //360 
opt.outWidth = shortWidth;//248 
imageBitmap = BitmapFactory.decodeByteArray(imageArray, 0, imageSize, opt); 

decodeByteArray返回,因爲它不能解碼我的形象。

我還試圖直接從輸入流中讀取它,而無需首先將其轉換爲一個字節數組:

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt); 

這返回爲好。

我在這&其他論壇搜索,但無法找到一種方法來實現這一點。

任何想法?

編輯:我應該補充說,我做的第一件事是檢查流是否實際上包含原始圖像。我使用其他應用程序(iPhone/Windows MFC)&,他們能夠讀取它並正確顯示圖像。我只需要找出在Java/Android中執行此操作的方法。

回答

11

Android不支持灰度位圖。首先,您必須將每個字節擴展到32位ARGB int。 Alpha是0xff,R,G和B是源圖像字節像素值的副本。然後在該數組之上創建位圖。

另外(看評論),似乎該設備認爲0是白色的,1是黑色的 - 我們必須反轉源位。

因此,我們假設源圖像位於名爲Src的字節數組中。這裏的代碼:

byte [] src; //Comes from somewhere... 
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes. 
int i; 
for(i=0;i<src.length;i++) 
{ 
    bits[i*4] = 
     bits[i*4+1] = 
     bits[i*4+2] = ~src[i]; //Invert the source bits 
    bits[i*4+3] = 0xff; // the alpha. 
} 

//Now put these nice RGBA pixels into a Bitmap object 

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits)); 
+0

@Seva Alekseyev:謝謝你的答案。我嘗試了你的建議。我得到一個RuntimeException。根據logcat「緩衝區不夠大的像素」。我創建的位圖使用寬度&圖像的高度 – OceanBlue 2011-04-12 15:25:26

+0

@OceanBlue:消息提示位緩衝區小於4 *寬*高字節長,檢查它是否是ARGB_888是每像素4字節格式 – 2011-04-12 15:29:32

+0

@Seva Alekseyev:我知道確保位緩衝區是寬度*高度字節長,圖像是每個像素格式1個字節,所以即使我創建了4倍大小的字節數組,圖像也會存儲在它的前1/4部分。在Android中碰巧知道任何「1字節/像素」格式? – OceanBlue 2011-04-12 21:28:38

1

一旦我做了這樣的事情,從相機預覽回調獲得的字節流進行解碼:

Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
         Bitmap.Config.ARGB_8888); 

試試看吧。

+1

感謝您的答案。第一個參數「imageBytes」包含什麼?在在線Javadoc中看到的Bitmap.createBitmap(...)的所有重載版本中,沒有一個將字節數組作爲參數。 – OceanBlue 2011-04-12 14:17:53

+1

沒有這樣的方法。 – Peter 2013-03-03 16:43:19

0

使用來自流的Drawable create。以下是如何使用HttpResponse完成此操作,但無論如何您都可以獲得輸入流。

InputStream stream = response.getEntity().getContent(); 

    Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task"); 
+0

感謝您的回答。不幸的是,這也返回null :-(我檢查了在線JavaDocs爲什麼Drawable.createFromStream會返回null http://developer.android。com/reference/android/graphics/drawable/Drawable.html#createFromStream%28java.io.InputStream,%20java.lang.String%29,但沒有詳細說明。我應該補充一點,我知道流本身是有效的,因爲另一個非Android應用程序能夠讀取它並顯示圖像。 (我沒有該應用程序的源代碼)。 – OceanBlue 2011-04-11 21:03:51

+0

似乎你的服務沒有正確地返回圖像。 – 2011-04-11 21:19:07

+0

當然,這是最可能的可能性,但我已經測試和服務正在返回圖像(請參閱我的編輯在問題中)。所以我現在flummoxed :-( – OceanBlue 2011-04-12 14:26:06

相關問題