我需要处理我的相机视图生成的所有帧才能读取条形码。
我使用 HTC Sensation(我还没有其他手机可以测试它)
所以我打电话给 getSupportedPreviewSizes 来选择我可以使用的最佳分辨率,我得到了:
1920,1088
1280,720
960,544
800,480
720,480
640,480
640,368
480,320
352,288
320,240
176,144
但只有 640x480 有效:(
如果我使用:
参数.setPreviewSize(800 , 600);
或者
参数.setPreviewSize(960, 544);
或者
参数.setPreviewSize(1280, 720);
然后我得到的图片被剥离,我在这里给你看一个例子:
如果我使用设置 3264x1840 或 2592x1456 作为预览大小,它没有效果,生成的图片仍然有 640x480 的大小
如果我将 1920x1088 设置为预览大小,我会遇到这个致命的错误,它会自动重新启动应用程序:
致命信号 11 (SIGSEGV) 在 0x417db2d9 (code=2)
为了您的信息,我复制/粘贴了我的 onPreviewFrame 的正文:
public void onPreviewFrame(byte[] data, Camera camera)
{
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
Parameters parameters = camera.getParameters();
YuvImage image = new YuvImage(data , parameters.getPreviewFormat(), width , height , null);
String resultText = "";
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0 , 0 , image.getWidth() , image.getHeight()), 100, baos);
// Convertie YUV TO BITMAP
Bitmap bitmap = BitmapFactory.decodeByteArray( baos.toByteArray(), 0, baos.size());
FileOutputStream outStream = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.close();
outStream.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
}
我用我的 surfaceChanged 函数的代码更新了我的帖子,其中包括回调缓冲区的代码:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
try
{
Parameters parameters = camera.getParameters();
// parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // ACTIVE FLASH SI NECESSAIRE
// parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO ); // ACTIVE AUTOFOCURS
// parameters.setSceneMode(Camera.Parameters.SCENE_MODE_STEADYPHOTO);
String focusMode = Utils.findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO, Camera.Parameters.FOCUS_MODE_MACRO);
if (focusMode != null)
{
parameters.setFocusMode(focusMode);
}
Log.e(TAG , "PREVIEWS : ");
List<Size> previews = parameters.getSupportedPreviewSizes();
for(int i = 0 ; i < previews.size() ; i++)
{
Log.e(TAG , i + " : " + previews.get(i).width + "," + previews.get(i).height);
}
Log.e(TAG , "PICTURES : ");
List<Size> pictures = parameters.getSupportedPictureSizes();
for(int i = 0 ; i < pictures.size() ; i++)
{
Log.e(TAG , i + " : " + pictures.get(i).width + "," + pictures.get(i).height);
}
Size preview = previews.get(1);
parameters.getSupportedPictureSizes();
// parameters.setPreviewSize(preview.width , preview.height);
// Camera.Size size = getBestPreviewSize(width, height);
parameters.setPictureSize(1280 , 720);
parameters.setPreviewSize(1280 , 720);
camera.setParameters(parameters);
// camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
camera.startPreview();
camera.autoFocus(autoFocusCallback);
///////////////////////////////////////////////////////////
int imgformat = parameters.getPreviewFormat();
int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);
Camera.Size camerasize = parameters.getPreviewSize();
int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;
byte[] buffer = new byte[frame_size];
camera.addCallbackBuffer(buffer);
}
catch (Exception e)
{
e.printStackTrace();
}
}
但即使使用回调缓冲区,问题仍然存在,图片被剥离。
我做错什么了吗 ?
谢谢