2013-11-27 52 views
2

由於臉部檢測器僅適用於jpg文件,您如何使它適用於所有格式?我讓用戶從SD卡中選擇任何圖像,以便圖像可以是任何格式。比我用decodefile方法,在這篇文章中提到的縮小圖片: Android: Resize a large bitmap file to scaled output file使臉部檢測器適用於任何文件格式

我的問題是:
我們可以添加decodefile方法裏面的一些方法來轉換圖像先JPG?
什麼是最好的和有效的方式來將圖像轉換爲JPG,所以面部檢測器類檢測面部?

我迄今爲止代碼:

public FaceView(Context context) { 
      super(context);       
      File photo = new File(selectedImagePath);      
      sourceImage = decodeFile(photo); 

      picWidth = sourceImage.getWidth(); 
      picHeight = sourceImage.getHeight(); 

      sourceImage = Bitmap.createScaledBitmap (sourceImage, picWidth, picHeight, false);          

      arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES); 
      arrayFaces.findFaces(sourceImage, getAllFaces); 

      for (int i = 0; i < getAllFaces.length; i++) 
      { 
       getFace = getAllFaces[i]; 
       try { 
        PointF eyesMP = new PointF(); 
        getFace.getMidPoint(eyesMP); 
        eyesDistance[i] = getFace.eyesDistance(); 
        Log.d("1st eye distance", "" + getFace.eyesDistance()); 
        eyesMidPts[i] = eyesMP;     
       } 
       catch (Exception e) 
       { 
        if (DEBUG) Log.e("Face", i + " is null"); 
       } 
      }     
     } 

解碼方法:

private Bitmap decodeFile(File f){ 
      Bitmap b = null; 
      int screenWidth = 0; 
      int screenHeight = 0; 
      Point size = new Point(); 
      WindowManager w = getWindowManager(); 

      if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) 
      { 
       w.getDefaultDisplay().getSize(size); 
       screenWidth = size.x; 
       screenHeight = size.y; 
      } 
      else 
      { 
       Display d = w.getDefaultDisplay(); 
       screenWidth = d.getWidth(); 
       screenHeight = d.getHeight(); 
      } 

      //Decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options();  
      o.inJustDecodeBounds = true; 

      FileInputStream fis = null; 
      try{ 
       fis = new FileInputStream(f); 
       BitmapFactory.decodeStream(fis, null, o); 
       fis.close(); 

       // was > IMAGE_MAX_SIZE for both i changed it**** 
       int scale = 1; 
       if (o.outHeight > screenHeight || o.outWidth > screenWidth) { 
        scale = (int)Math.pow(2, (int) Math.round(Math.log(screenHeight/
          (double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
       } 

       //Decode with inSampleSize 
       BitmapFactory.Options o2 = new BitmapFactory.Options(); 
       o2.inSampleSize = scale; 
       fis = new FileInputStream(f); 
       b = BitmapFactory.decodeStream(fis, null, o2); 
       fis.close();   
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return b; 
     } 
+0

請發佈您現在使用的代碼。 –

+0

@MichaelPerrenoud - 上面的代碼。 – NoviceMe

+0

所有格式與Java(GIF,PNG,BMP,WBMP)或其他格式(ICO,TIFF等)支持的格式一樣嗎?另外,你可以更具體地瞭解你正在尋找哪種圖像格式,或者它是從字面上來看所有的圖像?我假設這些會是光柵? –

回答

5

在你decodeFile()方法的末尾,你有一個位圖。您可以輕鬆地依賴Android的使用

Bitmap.compress(Bitmap.CompressFormat format, int quality, OutputStream stream) 

將其轉換成一個JPEGBitmap.CompressFormat.JPEG

這裏還有更多的信息:Conversion of bitmap into jpeg in android

您應該能夠要麼將它保存到文件壓縮到內存中(可能使用ByteArrayOutputStream?)

0

實際上,站在FaceDetector.findFaces documentation,輸入位圖必須是565格式。因此:

BitmapFactory.Options o = new BitmapFactory.Options(); 
o.inPreferredConfig = Bitmap.Config.RGB_565; 
Bitmap b = BitmapFactory.decodeFile(selectedImagePath, o); 

應該可以正常工作! BitmapFactory應正確處理輸入文件格式。

+0

我沒有將它們轉換爲灰度,這使得它RGB_565,但它仍然不處理所有。 – NoviceMe

相關問題