2016-07-20 83 views
0

當我試圖將Mat圖像轉換爲位圖時,圖像不會顯示在我的設備中,相反,當我使用位圖時。 Config.RGB_565顯示的圖像是黑色的。這裏是我的代碼:將圖像轉換爲位圖後,圖像爲黑色或根本不顯示

Mat src = new Mat(bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC1); 
imgToProcess = Utils.bitmapToMat(bmp, src); 
Bitmap bmpOut = Bitmap.createBitmap(imgToProcess.cols(),imgToProcess.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(imgToProcess, bmpOut); 
imv.setImageBitmap(bmpOut); 
rotateImage(bmpOut); 

,我使用所有的以下庫:

import org.opencv.android.OpenCVLoader; 
import org.opencv.android.Utils; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.Scalar; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.media.ExifInterface; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 

我已經嘗試我的圖像轉換成不同的色彩空間轉換與Imgproc.cvtColor()爲位圖前,但應用程序是停止工作。 如何修復我的代碼,以便我可以從圖像處理開始? 在此先感謝。

+0

'imgToProcess = Utils.bitmapToMat(bmp,src);'。請解釋這個聲明。如果位圖轉換爲Mat。那麼imgToProcess會在之後包含Mat?您將imgToProcess定義爲Mat?你爲什麼不展示?如果是這樣,那麼爲什麼需要src參數? – greenapps

+0

是的,我已經將imgToProcess定義爲一個Mat,它將包含Mat。 –

+0

我的問題是與matToBitmap轉換。 –

回答

0

該文檔不是已過期明確,但看起來ARGB_8888實際上意味着:每通道8位,通道順序爲Alpha,Red,Green,Blue。

https://developer.android.com/reference/android/graphics/Bitmap.Config.html

當使用RGB_565(如上面的鏈接介紹了一點更清楚),則在「紅,綠,藍」,沒有alpha通道的順序獲得信道。

位圖圖像不支持Alpha通道 - 定義不透明度(與透明度相反)的通道,值1.0(或二進制中的所有1)完全不透明(完全不透明),值0.0是完全透明的(完全透明)。

由於您試圖將4通道圖像寫入位圖的3通道支持,實際上將「Alpha,Red,Green」(ARG)映射到「Red,Green」 ,藍色「的位圖圖像預期。

現在,從技術上講,你可以做出古怪的事情,使ARG以RGB格式顯示爲圖像,但是也假設A和RGB都在同一個域中(0-to-2550.0-to-1.0)。對於任何試圖遵循你的代碼的人來說,這大都是不可讀的。

最有可能你也越來越黑色圖像時,如果使用正確的RGB_565格式,因爲你做的new Mat(...)並沒有賦予它的任何內容,並通過設計Mat類有可能與充滿0渠道實例化它的對象(0,0,0)(R,G,B)格式是黑色像素,所以每個像素都是黑色的。

如果您需要位圖並且只在支持alpha-masks(也稱爲alpha通道)的圖像上使用ARGB_8888(如PNG(便攜式網絡圖形[圖像]),則您的解決方案是切換到正確的RGB_565)然後還要確保爲您的像素填充所需顏色值的內容。如果你使用RGB_565

你的代碼是正確的,但它也是正確給你一個全黑的圖片,因爲您沒有修改任何的像素內容呢。