2011-03-10 154 views
8

我的應用程序有一個「大頭」功能,可讓用戶在拍照與攝像頭,並同時顯示在相機視圖上重疊圖像。拍完照片後,我需要保存用戶在拍攝照片到文件系統時看到的內容。用相機保存圖像疊加拍攝的圖像underneith

我曾經歷過1度大的問題,而開發的解決方案是:捕捉與兼容的尺寸,我可以覆蓋圖像附加到產生,而拍照什麼的用戶看到的圖像。

我似乎無法從相機定義尺寸(我必須從基本上它們的列表中選擇)拍攝的圖像。有些手機只能產生一定的尺寸。

既然不能選擇捕捉圖像的大小,看起來好像我將需要包括疊加圖像的許多不同的尺寸,並附加了最佳匹配所拍攝的圖像。我不能在攝像機圖像上拍攝任何舊的覆蓋圖,並使其看起來正確。

問題:

  • 我是過於複雜這個「攝像機圖像+覆蓋圖像創造」的過程?
  • 你有什麼樣的建議來完成這項任務,而不需要包括幾個不同尺寸的覆蓋圖像?

編輯: 這是我的解決方案(簡要)。請意識到這不是一個完美的,也許不是最有效的方式來做到這一點,但它的工作原理。有些東西可能是不必要的/多餘的,但無論如何

注:

  • 這不起作用太大的平板設備。
  • 覆蓋圖像需要被旋轉到橫向模式(即使你將採取的圖像保存在手機中的縱向)
  • 覆蓋規模小480x320
  • 需要強制活動爲橫向模式,而拍攝照片(現已覆蓋看起來像它的畫像!)
  • 我添加使用addContentView(overlayImageView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

...疊加圖像視圖

final Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     Bitmap mutableBitmap = null; 
     try { 
        //for a PORTRAIT overlay and taking the image holding the phone in PORTRAIT mode 
      mutableBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options).copy(Bitmap.Config.RGB_565, true); 
      Matrix matrix = new Matrix(); 
      int width = mutableBitmap.getWidth(); 
      int height = mutableBitmap.getHeight(); 
      int newWidth = overlayImage.getDrawable().getBounds().width(); 
      int newHeight = overlayImage.getDrawable().getBounds().height(); 
      float scaleWidth = ((float) newWidth)/width; 
      float scaleHeight = ((float) newHeight)/height; 
      matrix.postScale(scaleWidth, scaleHeight); 
      matrix.postRotate(90); 

      Bitmap resizedBitmap = Bitmap.createBitmap(mutableBitmap, 0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight(), matrix, true); 
      finalBitmap = resizedBitmap.copy(Bitmap.Config.RGB_565, true); 
      Canvas canvas = new Canvas(finalBitmap); 

      Bitmap overlayBitmap = BitmapFactory.decodeResource(getResources(), overlay); 
      matrix = new Matrix(); 
      matrix.postRotate(90); 
      Bitmap resizedOverlay = Bitmap.createBitmap(overlayBitmap, 0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight(), matrix, true); 
      canvas.drawBitmap(resizedOverlay, 0, 0, new Paint()); 
      canvas.scale(50, 0); 
      canvas.save(); 
      //finalBitmap is the image with the overlay on it 
     } 
     catch(OutOfMemoryError e) { 
      //fail 
     } 
    } 
} 
+0

嗨,binnyb! 現在有類似的問題。 你能幫我嗎? 你能顯示你的代碼嗎? 謝謝! – vsvydenko 2012-01-04 19:50:43

回答

1

我認爲這是一個如何操縱覆蓋層的問題。您可以根據捕獲的圖像大小裁剪它,並調整它的大小以適合其比例。您可以通過將覆蓋率與背景比率進行比較來放置其最佳位置。

我會使用過濾器具有良好的qaulity繪製保持覆蓋足夠大,具有廣泛的邊界(出血),輕鬆它們的尺寸爲圖像。我認爲疊加層是你設計的並且具有透明部分的東西,比如沒有臉的小丑的圖像,因此用戶可以將其他人的臉貼到它上面?

+0

是的,覆蓋圖像可能類似於「瞄準相機,因此您的目標的頭部應該是小丑頭部的位置」 – binnyb 2011-03-10 18:28:33

+0

在這種情況下,您的覆蓋圖應該具有足夠寬的「流血」,以便您可以輕鬆裁剪它們。您還必須將公式調整爲不同的方向。 – Lumis 2011-03-10 18:40:39

+0

arg ...這是一種痛苦!一旦我完成了這個任務,我會更新這篇文章'接受的答案。我一直在這裏,所以你會在適當的時候獲得信貸! – binnyb 2011-03-10 18:50:40

相關問題