当前位置:编程学习 > wap >>

调用Camera拍照的问题

调用takePicture(null, null, mPictureCallback);

这个方法调用后会生成一张刚才拍照的效果图,不想生成这个图片,想在mPictureCallback方法中对图片做个处理再显示出来,请问该怎样做? 

就这点分了,帮个忙吧! --------------------编程问答-------------------- 使用自己控制的拍照需要用到一个SurfaceView,它会绑定一个SurfaceHolder,但我使用SurfaceView去lock获取一个Canvas一直不成功,所以我的应用将拍照的图画回去是布局了一个ImageView来完成的。通过mPictureCallback我们可以得到拍摄照片的二进制数据,然后可以用BitmapFactory.decodeByteArray来得到编码后的Bitmap,我们可以利用Bitmap.createBitmap这个静态函数来讲一个Bitmap进行变形缩放等操作,只要传入一个Matrix对象即可。另外我们可以通过Canvas对象来进行Bitmap的叠加操作。这样你就可以将你的图片处理完后再画到ImageView上了。 --------------------编程问答-------------------- 哥们,你没明白我的意思啊。SurfaceView和Camera一起使用完成照相功能,调用Camera下的takePicture(null, null, mPictureCallback);方法完成拍照,但调用这个方法会在按下快门之后生成一张图像,我现在就是想不生成这个效果图像,而是在mPictureCallback中处理后再显示出来! --------------------编程问答-------------------- 我把代码贴出来吧,就是我随便在网上找的。

public class MainActivity extends Activity implements Callback, OnClickListener {
/** Called when the activity is first created. */
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
private boolean mPreviewRunning;
private ImageView mImageView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.main);
mSurfaceView = (SurfaceView) findViewById(R.id.camera);
// mSurfaceView.set
mImageView = (ImageView) findViewById(R.id.image);
mImageView.setVisibility(View.GONE);
mSurfaceView.setOnClickListener(this);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.lockCanvas();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// mSurfaceHolder.set
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (mPreviewRunning) {
mCamera.stopPreview();
// mCamera.set
}
Parameters params = mCamera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
// params.setp
params.setPreviewSize(0, 0);
params.setPictureSize(10, 10);
params.set("rotation", 90);
// params.set

Log.i("set0000000000000000", "set--------------------");
mCamera.setParameters(params);

try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
mPreviewRunning = true;
// mCamera.set
}

private AutoFocusCallback mAutoFocusCallBack = new AutoFocusCallback() {

@Override
public void onAutoFocus(boolean success, Camera camera) {

Log.v("AutoFocusCallback", "AutoFocusCallback" + success);
Camera.Parameters Parameters = mCamera.getParameters();
Parameters.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
// Parameters.set
mCamera.setParameters(Parameters);
mCamera.setPreviewCallback(null);
mCamera.takePicture(mShutterCallback, null, mPictureCallback);
// mCamera.setParameters(params)
// mCamera.set
}
};

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera.stopPreview();
mPreviewRunning = false;
mCamera.release();
mCamera = null;
}

/**
 * 拍照的回调接口
 */
PictureCallback mPictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.v("PictureCallback", "…onPictureTaken…");
if (data != null) {
new ProgressDialog(MainActivity.this).show();
}
}
};
/**
 * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
 * 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
 */
ShutterCallback mShutterCallback = new ShutterCallback() {

public void onShutter() {
// just log ,do nothing
// Log.v("ShutterCallback", "…onShutter…");
//  mSurfaceView.setVisibility(View.INVISIBLE);
// mImageView.setVisibility(View.VISIBLE);
}

};

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
if (mCamera != null) {
// mCamera.takePicture(null, null,mPictureCallback);
mCamera.autoFocus(mAutoFocusCallBack);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
return super.onKeyDown(keyCode, event);
}

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.v("onClick", "…onClick…");
mCamera.autoFocus(mAutoFocusCallBack);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

menu.add(0, 1, 0, "调用系统照相机");
return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case 1:
Intent intent = new Intent();
intent.setClass(MainActivity.this, MainActivity.class);
startActivity(intent);
break;
}
return true;
}
} --------------------编程问答-------------------- 各位路过的帮忙看看啊,3Q! --------------------编程问答-------------------- 拍完肯定是会产生原始的bmp格式文件的吧
要改底层的东西我估计 --------------------编程问答-------------------- 拍摄完成是不会默认把图画上去的。回调函数得到的是一个byte数组 --------------------编程问答-------------------- 只要调用takePicture(null, null, mPictureCallback);方法,就会产生一个图片。我测试过。至于5楼说的,我也像过,但我总感觉google不会被源码设计这么烂吧,我觉得是不是可以通过Parameters params = mCamera.getParameters();params设置一些参数来实现不显示图片的效果。 --------------------编程问答-------------------- getParameters()设置不了参数,get不是set。原帖说不生成图片,现在又说实现不显示图片…… 那你先用takePicture(null, null, mPictureCallback)照,然后再删了它不行么? 搞不懂你的需求了…… --------------------编程问答-------------------- 哦,抱歉,没有说明白,在调用takePicture(null, null, mPictureCallback)拍照后会立刻成一张像(就像刚才照相效果的预览一样)。我的目的是不显示这张预览的像,而是在这个方法的第三个参数的mPictureCallback的回调方法中对图像做一些处理,然后显示在一个ImageView控件之中,就是类似360的特效相机一样的效果。 --------------------编程问答-------------------- 帮忙看看了,在线等。 --------------------编程问答-------------------- 没用的。是在cameraservice层直接写死的。。代码如下:

status_t CameraService::Client::takePicture()
{
    LOGV("takePicture (pid %d)", getCallingPid());

    Mutex::Autolock lock(mLock);
    status_t result = checkPid();
    if (result != NO_ERROR) return result;

    if (mHardware == 0) {
        LOGE("mHardware is NULL, returning.");
        return INVALID_OPERATION;
    }

    mHardware->enableMsgType(CAMERA_MSG_SHUTTER |
                             CAMERA_MSG_POSTVIEW_FRAME |
                             CAMERA_MSG_RAW_IMAGE |
                             CAMERA_MSG_COMPRESSED_IMAGE);

    return mHardware->takePicture();
}


其中CAMERA_MSG_POSTVIEW_FRAME就是用于显示拍摄后的图像 --------------------编程问答-------------------- mPictureCallback回调里第一时间停止预览,就可以了。不过好像会闪一下黑屏。 --------------------编程问答-------------------- 11楼的兄台,高手啊。就没有别的方法了吗?我看市面上有些特效的相机软件(比如360)是可以做到类似的效果的,他们是怎么做到的呢?
12楼的兄台的方法我试过了,没有用的。即使将takePicture(null, null, null)这样设置也不会影响成像。成像和mPictureCallback参数无关。 --------------------编程问答-------------------- 我之前就是这么写的,一开始不清楚,以为必须自己画回去,所以我就在最开始停止预览,并将拍摄的照片数据解码并缩放后放到ImageView显示。 --------------------编程问答-------------------- 兄台,能将你mPictureCallback回调函数中的代码发给我看看嘛?
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,