j'ai besoin de capturer l'image de portion requise du .
capturer l'image à partir de appareil photo.
à ce moment autre contenu d'écran tel qu'il est .
comment est-ce possible?
essayez d'utiliser Vue de surface pour créer une vue dynamique caméra et définissez la portion requise.
essai de code suivant
les variables définissent le niveau de classe (global)
Button btn_capture;
Camera camera1;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
public static boolean previewing = false;
Code suivant dans la méthode 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);
}
}
});
Le code suivant place après onCreate () dans votre classe .
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;
}
dans AndroidManifest.xml donne autorisations utilisateur.
<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"/>
et aussi pas oublié (implémente SurfaceHolder.Callback) à la classe.
J'ai déjà créé ce genre d'appareil photo. Ce que j'ai fait, c'est que j'ai recouvert l'autre zone de l'appareil photo avec une image, et coupé la partie centrale de l'image et l'enregistrer en tant que fichier png, pour rendre le centre transparent.
Vous allez définir l'image d'arrière-plan de votre cadre (aperçu de la caméra) avec cette image. Pour qu'il ressemble à la caméra, il n'y a que la partie transparente ou le cercle.
J'ai utilisé ce tutoriel pour ouvrir, créer un aperçu et prendre des photos à partir de l'appareil photo http://developer.Android.com/guide/topics/media/camera.html
dans cette partie (vous pouvez le voir dans le lien que je fournis ci-dessus)
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
}
}
suivez ce tutoriel sur la façon de recadrer l'image en cercle Recadrage d'une zone circulaire à partir d'un bitmap dans Android
vous pouvez utiliser la vue de surface.Après avoir capturé l'image, vous pouvez obtenir un bitmap et dessiner une toile également
http://developer.Android.com/reference/Android/view/View.html#onDraw (Android.graphics.Canvas)
http://developer.Android.com/reference/Android/view/SurfaceView.html#setZOrderMediaOverlay (boolean)
Si la partie de l'écran est en fait une vue, vous ne pouvez capturer que cette vue. Comme ça:
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
Si vous souhaitez capturer uniquement une petite partie d'une vue, vous devez calculer le rectangle de ce côté. Ensuite:
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();
Ce n'est qu'un pseudocode, mais j'espère que vous avez compris l'idée. Traduisez et dessinez simplement la partie dont vous avez besoin.
utilisez TextureView pour l'aperçu, définissez layout_width et layout_height comme bon vous semble. voici le code:
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.
}
}
et fichier 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>
J'utilise CameraPreview dans l'application ApiDemos et le modifie selon vos besoins.
Tout d'abord, copiez le code de la classe Preview dans un nouveau fichier de classe dans le même package afin qu'il soit public et que vous puissiez le déclarer dans le fichier de disposition xml. N'oubliez pas d'ajouter un constructeur de plus comme ci-dessous:
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);
}
Exemple de fichier de disposition avec largeur et hauteur d'échantillon:
<?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>
Dans la méthode onCreate () de l'activité CameraPreview, modifiez la partie setContentView comme suit:
setContentView(R.layout.camera_layout);
mPreview = (Preview) findViewById(R.id.camera_view);