画面の必要な部分から画像をキャプチャ する必要があります。
カメラから画像をキャプチャします。
その際その他の画面内容はそのまま。
これはどのように可能ですか?
画面の必要な部分から画像をキャプチャ する必要があります。
カメラから画像をキャプチャします。
その際その他の画面内容はそのまま。
これはどのように可能ですか?
動的なカメラビューを作成し、必要な部分に設定するためにSurface Viewを使用してみてください。
次のコードを試してください
変数セット クラスレベル (グローバル)
Button btn_capture;
Camera camera1;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
public static boolean previewing = false;
onCreate()メソッドの次のコード
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = new SurfaceView(this);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btn_capture = (Button) findViewById(R.id.button1);
surfaceView.setBackgroundResource(R.drawable.your_background_image);
if(!previewing){
camera1 = Camera.open();
if (camera1 != null){
try {
camera1.setDisplayOrientation(90);
camera1.setPreviewDisplay(surfaceHolder);
camera1.startPreview();
previewing = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
btn_capture.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(camera != null)
{
camera1.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
}
}
});
次のコードは、クラスのonCreate()の後に配置します。
ShutterCallback myShutterCallback = new ShutterCallback(){
public void onShutter() {
// TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_RAW = new PictureCallback(){
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_JPG = new PictureCallback(){
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true);
}};
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if(previewing){
camera1.stopPreview();
previewing = false;
}
if (camera1 != null){
try {
camera1.setPreviewDisplay(surfaceHolder);
camera1.startPreview();
previewing = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera1.stopPreview();
camera1.release();
camera1 = null;
previewing = false;
}
AndroidManifest.xmlでuser-permissionsを付与します。
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
また、クラスに忘れないでください( SurfaceHolder.Callbackを実装します)。
私はすでにそのようなカメラを作成しました。私がしたことは、カメラの他の領域を画像で覆い、画像の中央部分を切り取ってpngファイルとして保存し、中央を透明にすることです。
その画像でフレームの背景画像(カメラプレビュー)を設定します。カメラが透明または円の部分のみであるように見えるようにします。
このチュートリアルを使用して、カメラ デバイスhttp://developer.android.com/guide/topics/media/camera.htmlを開いてプレビューを作成し、写真を撮りました。
この部分で(上記のリンクでこれを見ることができます)
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//this is where you crop your image
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inMutable = true;
Bitmap bitmap = BitmapFactory
.decodeByteArray(data, 0, data.length, opt);
bitmap=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas mcanvas=new Canvas(bitmap);
//do the cropping here, bitmap is the image you will use to crop
}
}
画像を円にトリミングする方法については、このチュートリアルに従ってください Androidでビットマップから円形領域をトリミングする
サーフェスビューを使用できます。画像をキャプチャした後、ビットマップを取得してキャンバスを描画することもできます
http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)
http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderMediaOverlay(boolean)
ApiDemos アプリケーションで CameraPreview を使用し、必要に応じて編集します。
最初に、Preview クラスのコードを同じパッケージ内の新しいクラス ファイルにコピーして、公開し、xml レイアウト ファイルで宣言できるようにします。以下のように、コンストラクターをもう 1 つ追加することを忘れないでください。
public Preview(Context context, AttributeSet attrs) {
super(context, attrs);
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
サンプルの幅と高さを含むサンプル レイアウト ファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Abow"/>
<com.example.android.apis.graphics.Preview
android:id="@+id/camera_view"
android:layout_width="240dp"
android:layout_height="180dp">
</com.example.android.apis.graphics.Preview>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Below"/>
</LinearLayout>
CameraPreview アクティビティの onCreate() メソッドで、setContentView 部分を次のように変更します。
setContentView(R.layout.camera_layout);
mPreview = (Preview) findViewById(R.id.camera_view);
プレビューに TextureView を使用し、layout_width と layout_height を必要に応じて設定します。コードは次のとおりです。
public class MainActivity extends Activity implements TextureView.SurfaceTextureListener {
private Camera mCamera;
private TextureView mTextureView;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextureView = (TextureView) findViewById(R.id.textureView);
mTextureView.setSurfaceTextureListener(this);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
mCamera = Camera.open();
try {
mCamera.setPreviewTexture(surfaceTexture);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException exception) {
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
mCamera.startPreview();
mCamera.release();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
//To change body of implemented methods use File | Settings | File Templates.
}
}
および xml ファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextureView
android:layout_gravity="center"
android:id="@+id/textureView"
android:layout_width="200dp"
android:layout_height="300dp"/>
</LinearLayout>
画面の一部が実際にビューである場合は、このビューのみをキャプチャできます。このような:
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
ビューのごく一部のみをキャプチャする場合は、この辺の長方形を計算する必要があります。それで:
Bitmap bitmap = Bitmap.createBitmap(rect.width(),rect.height(),Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.save();
canvas.translate(-rect.left,-rect.top);
view.draw(canvas);
canvas.restore();
これは疑似コードにすぎませんが、理解していただければ幸いです。必要な部分だけを翻訳して描くだけ。