天天看点

android zbar扫描区域,android – 如何更改扫描Zbar的区域?

我想改变相机扫描的区域.现在我拍摄的图像像设备的屏幕一样大.我正在努力裁剪图像进行分析.所以只是预览的中心将是源扫描.是否有任何选项可以将捕获的预览设置为较小或从byte []数据创建Bitmap,并且裁剪是获取较小区域的唯一方法?我正在尝试阅读有关它的内容,但Zbar

Android的文档非常差(与iOs相比).

主要活动

public class MainActivity extends Activity

{

private Camera mCamera;

private Context context;

private CameraPreview mPreview;

private Handler autoFocusHandler;

TextView scanText;

Button scanButton;

ImageScanner scanner;

private PowerManager.WakeLock wl;

private boolean barcodeScanned = false;

private boolean previewing = true;

static {

System.loadLibrary("iconv");

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

autoFocusHandler = new Handler();

mCamera = getCameraInstance();

context = getApplicationContext();

scanner = new ImageScanner();

scanner.setConfig(0, Config.X_DENSITY, 3);

scanner.setConfig(0, Config.Y_DENSITY, 3);

mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);

FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);

preview.addView(mPreview);

scanText = (TextView)findViewById(R.id.scanText);

}

@Override

public void onPause() {

super.onPause();

releaseCamera();

}

@Override

protected void onResume() {

// TODO Auto-generated method stub

onStart();

}

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

finish();

}

public static Camera getCameraInstance(){

Camera c = null;

try {

c = Camera.open();

} catch (Exception e){

}

return c;

}

private void releaseCamera() {

if (mCamera != null) {

previewing = false;

mCamera.setPreviewCallback(null);

mCamera.release();

mCamera = null;

}

}

private Runnable doAutoFocus = new Runnable() {

@Override

public void run() {

if (previewing)

mCamera.autoFocus(autoFocusCB);

}

};

PreviewCallback previewCb = new PreviewCallback() {

@Override

public void onPreviewFrame(byte[] data, Camera camera) {

Camera.Parameters parameters = camera.getParameters();

Size size = parameters.getPreviewSize();

//HERE we read taken picture from prieview

Image barcode = new Image(size.width, size.height, "Y800");

barcode.setData(data);

int result = scanner.scanImage(barcode);

if (result != 0) {

previewing = false;

mCamera.setPreviewCallback(null);

mCamera.stopPreview();

SymbolSet syms = scanner.getResults();

for (Symbol sym : syms) {

if (sym.getType() == Symbol.CODE128) {

sym.getData());

MediaPlayer mp = MediaPlayer.create(context, R.raw.beep_ok);

mp.start();

} else {

MediaPlayer mp = MediaPlayer.create(context, R.raw.beep_wrong);

mp.start();

}

mCamera.setPreviewCallback(previewCb);

mCamera.startPreview();

previewing = true;

mCamera.autoFocus(autoFocusCB);

}

}

}

};

// Mimic continuous auto-focusing

AutoFocusCallback autoFocusCB = new AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

autoFocusHandler.postDelayed(doAutoFocus, 1000);

}

};

//Method to crop Bitmap in case of use

public Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) {

int sourceWidth = source.getWidth();

int sourceHeight = source.getHeight();

float xScale = (float) newWidth / sourceWidth;

float yScale = (float) newHeight / sourceHeight;

float scale = Math.max(xScale, yScale);

float scaledWidth = scale * sourceWidth;

float scaledHeight = scale * sourceHeight;

float left = (newWidth - scaledWidth) / 2;

float top = (newHeight - scaledHeight) / 2;

RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);

Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());

Canvas canvas = new Canvas(dest);

canvas.drawBitmap(source, null, targetRect, null);

return dest;

}

}

CameraPrieview.java

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mHolder;

private Camera mCamera;

private PreviewCallback previewCallback;

private AutoFocusCallback autoFocusCallback;

public CameraPreview(Context context, Camera camera,

PreviewCallback previewCb,

AutoFocusCallback autoFocusCb) {

super(context);

mCamera = camera;

previewCallback = previewCb;

autoFocusCallback = autoFocusCb;

// Install a SurfaceHolder.Callback so we get notified when the

// underlying surface is created and destroyed.

mHolder = getHolder();

mHolder.addCallback(this);

// deprecated setting, but required on Android versions prior to 3.0

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// The Surface has been created, now tell the camera where to draw the preview.

try {

mCamera.setPreviewDisplay(holder);

} catch (IOException e) {

Log.d("DBG", "Error setting camera preview: " + e.getMessage());

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// Camera preview released in activity

}

@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 {

// Hard code camera surface rotation 90 degs to match Activity view in portrait

mCamera.setDisplayOrientation(90);

mCamera.setPreviewDisplay(mHolder);

mCamera.setPreviewCallback(previewCallback);

mCamera.startPreview();

mCamera.autoFocus(autoFocusCallback);

} catch (Exception e){

Log.d("DBG", "Error starting camera preview: " + e.getMessage());

}

}

}