上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Android] カメラピュレビューからの画像保存

コメントをいただきましたので、
-----------------------------
カメラプレビュー
 ↓
ボタン押下
 ↓
画像保存
 ↓
ギャラリー表示
-----------------------------

というのを試してみました。


まずは、お試しコード。
不十分な個所が多いので、改善が必要かな・・・
public class SampleActivity extends Activity {

Activity mActivity;
Camera mCamera; // カメラインスタンス

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mActivity = this;

FrameLayout frameLayout = new FrameLayout(this);

Button btn = new Button(this);
btn.setText("ボタン");
btn.setOnClickListener(new OnClickButton());

SurfaceView sv = new SurfaceView(this);
SurfaceHolder sh = sv.getHolder();
sh.addCallback(new SurfaceHolderCbk());
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);

frameLayout.addView(sv);
frameLayout.addView(btn, layoutParams);

setContentView(frameLayout);
}

public class SurfaceHolderCbk implements SurfaceHolder.Callback {

/**
* サーフェイスが変更された時のコールバック。
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// カメラプレビューを開始
mCamera.startPreview();
}

/**
* サーフェイスが生成された時のコールバック
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// カメラオープン
mCamera = Camera.open();
try {
// プレビューを表示するサーフェイスホルダーを設定
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* サーフェイスが破棄された時のコールバック
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// カメラプレビューを停止
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}

private PreviewCallback previewCallback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// プレビューコールバックを解除
mCamera.setPreviewCallback(null);

// カメラのデータフォーマットを取得する
int format = mCamera.getParameters().getPreviewFormat();
YuvImage yuvimage = new YuvImage(
data,
format,
mCamera.getParameters().getPreviewSize().width,
mCamera.getParameters().getPreviewSize().height,
null);

Rect rect = new Rect(0, 0, mCamera.getParameters().getPreviewSize().width, mCamera.getParameters().getPreviewSize().height);

// JPEGに変換してファイル保存
try {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/sample.jpg");
FileOutputStream out = new FileOutputStream(file, true);
yuvimage.compressToJpeg(rect, 50, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}

// ギャラリーに反映
sendBroadcast(
new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse( "file://" + Environment.getExternalStorageDirectory() )
)
);
}
};

public class OnClickButton implements OnClickListener {

@Override
public void onClick(View v) {
// プレビューコールバックを設定
mCamera.setPreviewCallback(previewCallback);
}

}

}


カメラプレビューを表示する部分に関しては、
[Android] カメラプレビューを表示してみる
を参考に。

画像の保存は、PreviewCallback#onPreviewFrame() で行った。
Cameraインスタンスにコールバックをセットすると呼び出されるようになる。

プレビューイメージはbyte配列で、YuvImageという形式なので、
Jpegなどに変換してあげるのが一般的なのかな。

YuvImage については Developpers サイトを参考に。
http://developer.android.com/intl/ja/reference/android/graphics/YuvImage.html

YuvImage#compressToJpeg() を使用することで簡単に変換できます。


今回は、SDカードへ保存しました。
ちなみに、SDカード保存時は以下のパーミッションを忘れずに。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

ギャラリーの追加は画像ファイル保存しておけばAndroid側で自動的に、
拾ってギャラリーに登録してくれるかと思ってましたが、勘違いだったようです。。。

そこで、ギャラリーに反映させるために、ブロードキャストで ACTION_MEDIA_MOUNTED を通知した。
SDカードがスキャンされ、ギャラリーに追加されました。


動作的には、ちゃんと画像保存されてギャラリーにも出てきたが、
改良は必要だろうな。。。



コメントの投稿

非公開コメント

プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。