2012-02-23 135 views
4

我製作相機並嘗試拍攝照片。由於原始數據是YUV,我把它變成RGB使用功能:從Android相機捕獲的照片是完全黑色的

static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp,int width, int height) 

然而,保存照片完全是黑色的,在它裏面沒有內容。

我還發現了以下的方法:

mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

但該項目被關閉。

有沒有其他有效的方法來保存照片?謝謝!

回答

6

舊的文章,但它說我有,所以我還不如回答我知道的部分:)

你可能做錯了類似的問題。我建議你使用JPEG回調存儲圖像:

mCamera.takePicture(null, null, callbackJPEG); 

這樣你會得到JPEG數據可以在其中存儲到未修改文件的程序:據

final Camera.PictureCallback mCall = new Camera.PictureCallback() 
{ 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) 
    { 
    //Needs <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    File sdCard = Environment.getExternalStorageDirectory(); 
    File file = new File(sdCard, "pic.jpg"); 
    fil = new FileOutputStream(file); 
    fil.write(data); 
    fil.close();   
    } 
} 

爲黑色圖片去了,我發現在camera.startPreview()camera.takePicture()之間放置一個簡單的Thread.sleep(250)就可以解決Galaxy Nexus上的特殊問題。 我不知道爲什麼這個延遲是必要的。即使我添加camera.setOneShotPreviewCallback()並從回調中撥打電話camera.takePicture(),如果我不首先延遲,圖像會變黑。 哦,延遲不僅僅是「某些」延遲。它必須有相當長的價值。例如,250ms有時可用,有時不在我的手機上。

+0

現在我正在努力解決同樣的問題。我的設備也是Galaxy Nexus。你有沒有設法找到一個可行的解決方案? – 2016-01-15 10:59:22

+0

您是否在其他設備上獲得了完全黑色的照片? – 2016-01-15 11:39:05

+0

解答中描述的工作解決方案。是的,該問題已被其他設備的用戶確認。 – velis 2016-01-18 19:57:39

2

完整的黑色照片是在撥打mCamera.startPreview()後立即致電mCamera.takePicture()的結果。在拍攝實際照片之前,Android應給予適當的時間來處理其自動對焦活動。黑色是自動對焦發生時由於中斷而導致曝光不穩定的結果。

我建議在mCamera.startPreview()之後立即致電mCamera.autoFocus()

應該在自動對焦功能調用的回調函數中調用mCamera.takePicture()

此流程可確保在自動對焦完成後拍攝照片,並從拍攝的圖像中消除黑色或曝光問題。

中提到的延遲Velis'答案適用於某些設備,因爲這些設備完成自動對焦活動。確保正確的回調流程消除了這種任意延遲,並且可以在每個設備上工作。

+0

謝謝!我正在構建一個龐大的圖像數據庫,其中有百分之幾是黑色的。 – domenukk 2016-11-19 13:24:10

1

我解決了使用下面的說法這個問題:

final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

當我使用TEMPLATE_STILL_CAPTURE代替TEMPLATE_PREVIEW,這是我的捕捉圖像作爲全黑圖像。這件事對我來說很有用。

+0

我這樣做加上使用CONTINUOUS_PICTURE和setRepeating(...) – Clocker 2017-12-22 20:18:20