I want to scan QR code from camera. I know about ZXING and i am using it too, but i want to scan the codes in my custom camera preview. All i need is to get a bitmap from camera preview. I am searching about it but unfortunately i didn't got any solution. Here's my implementation
public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
Camera.Parameters parameters;
int width, height, imageFormat;
@SuppressWarnings("deprecation")
public CameraPreview(final Context context, Camera camera) {
super(context);
_ctx = context;
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (mHolder.getSurface() == null) {
// Preview surface does not exist
return;
}
// Stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e) {
// Ignore : Tried to stop a non-existent preview
}
try {
mCamera.setPreviewDisplay(mHolder);
// mCamera.startPreview();
} catch (Exception e) {
Log.d("SURFACECHANGED",
"Error starting camera preview: " + e.getMessage());
}
}
@SuppressLint("NewApi")
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO The Surface has been created, now tell the camera where to draw
// the preview.
try {
mCamera.setPreviewDisplay(holder);
Toast.makeText(_ctx, "surface created", Toast.LENGTH_SHORT).show();
mCamera.setOneShotPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (camera != null) {
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21) {
int w = parameters.getPictureSize().width;
int h = parameters.getPictureSize().height;
YuvImage yuvImage = new YuvImage(mData, imageFormat, w, h, null);
Rect rect = new Rect(0, 0, w, h);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(rect, 100, baos);
byte[] jData = baos.toByteArray();
bitmap = BitmapFactory.decodeByteArray(jData, 0, jData.length);
}
else if (imageFormat == ImageFormat.JPEG || imageFormat == ImageFormat.RGB_565)
{
bitmap = BitmapFactory.decodeByteArray(mData, 0, mData.length);
}
}
if (bitmap != null) {
saveImage(bitmap);
}
}
});
parameters = mCamera.getParameters();
mCamera.setParameters(parameters);
mCamera.startPreview();
} catch (Exception e) {
Log.d("SURFACECREATED",
"Error setting camera preview: " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
0 comments:
Post a Comment