標籤

2011年10月9日 星期日

相機SurfaceView 含畫面一起 SCREENSHOT?

說起這個問題, 原先也以為很簡單, 結果一點也不簡單.

原因有二.

1. 必須在Activity 下去 CAPTURE 畫面. 這部份是完全簡單. 你只需要一個寫一個 CLASS 來處理即可.


public class Mycamera extends Activity implements SurfaceHolder.Callback {

ScreenShot.shoot(this);

這種 CLASS 全世界都找得到, 所以沒必要說明了

2. Camera 的影像來自於 surfaceviw. 是變動的. 所以你無論怎麼抓. 永遠都是空的. 即使你使用

  myCamera.stopPreview();
  myCamera.lock..... 等等. 無論你怎麼做. 都是空的

好吧. 我也們觀察到,

   myCamera.takePicture(shutterCallback, rawPictureCallback,
     jpegPictureCallback);

這時圖片是靜止的. 很不幸的是, 你仍然是抓到空值.

可是你直接取得 myCamera 的圖片呢? 又達不到 SCREENSHOT 的效果, 也就是說. 要咩, 你只有你程式畫面, 要咩, 你只有照像機畫面.

為了這個問題, 想了二天整. 也找不到任何命令來解決這個問題.

昨天晚上睡到一半, 突然想起, 山不轉路可以轉. 我們再"製造" 一個 ImageView 放在 surfaceView 上面. 然照完相後, 讓 .setVisibility(View.VISIBLE);

這樣子, 總能抓到了.

於是呢? 簡單的程式10分鐘搞定. 然後馬上抓狂!!!!

因為影像是 -90 度. 也就是說. 你是手機平放所看到的畫面.

這... 也沒問題. 所以我們強制影像轉 90 度, 再放大到原來的 SIZE.

可是再怎麼放大. 總是錯的.

10 分鐘的程式除錯了10 小時, 還是找不到問題在那?

後來終於"頓悟" 影像是要先 "旋轉" +90 度後. 再去放大. 才會是正常直立時看到的畫面. 丫看!

   Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0,
     arg0.length);
   Matrix matrix = new Matrix();
   matrix.postScale(1, 1);
   matrix.postRotate(90);
   Bitmap resizedBitmap = Bitmap.createBitmap(bitmapPicture, 0, 0,
     bitmapPicture.getWidth(), bitmapPicture.getHeight(),
     matrix, true);
   // 大小不變, 先旋轉 90 度 因為我們是直立
   int width = resizedBitmap.getWidth();
   int height = resizedBitmap.getHeight();

   // Log.d("wh","w: "+String.valueOf(width)+" h: "+String.valueOf(height));
   float scaleWidth = (float) newwidth / width;
   float scaleHeight = (float) newheight / height;
   // Log.d("wh","w: "+String.valueOf(scaleWidth)+" h: "+String.valueOf(scaleHeight
   // ));
   matrix = new Matrix();
   matrix.postScale(scaleWidth, scaleHeight);
   // matrix.postRotate(90);
   resizedBitmap = Bitmap.createBitmap(resizedBitmap, 0, 0, width,
     height, matrix, true);


這才是真正的解法!  人老了, 這麼簡單的錯誤居然花了 10 小時. 真是..^$&^*(&)*


所以啦, 我的方法很簡單.

  <SurfaceView android:id="@+id/surfaceView1"
   android:layout_alignParentTop="true" android:layout_centerHorizontal="true"
   android:layout_height="fill_parent" android:layout_width="fill_parent"></SurfaceView>
     <ImageView android:src="@drawable/icon"
   android:id="@+id/photoscreen" android:layout_height="fill_parent" android:layout_width="fill_parent" android:visibility="invisible"></ImageView>
  <ImageView android:src="@drawable/icon"
   android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/cambackfround" android:visibility="invisible"></ImageView>

等照像完成了. 將 cambackground 設成 visible 再將畫面畫上去.

丫... 影像是解決了. 可是畫上去需要時間, 太早存畫面, 一樣是空值啦 >"<

怎麼辦呢?

好吧. 那就只好賤一點, 建立 "拍照" 和"上傳" 二個部份. 拍照畫面會停格, 重拍時可以換畫面.
但是上傳發生時, 再做 ScreenShot!

受限於老闆不想要公開寫作內容, 所以 APK 和 SOURCECODE 就不上傳了.

但是有這些資訊, 問題應該也已經解決了.

沒有留言:

張貼留言