我需要处理我的相机视图生成的所有帧,以便读取条形码。
我使用HTC Sensation(我还没有另外一部手机进行测试)
所以我调用getSupportedPreviewSizes来选择我可以使用的最佳分辨率,我得到了:
1920,1088
1280,720
960544
800480
720480
640480
640368
480320
352288
320240
176144
但只有640x480可以工作:(
如果我使用:
parameters.setPreviewSize(800,600);
OR
parameters.setPreviewSize(960,544);
OR
parameters.setPreviewSize(1280,720);
然后我得到的图片被删除了,我在这里给你举个例子:
如果我使用设置3264x1840或2592x1456作为预览尺寸,它没有效果,生成的图片仍然具有640x480的尺寸
如果我将1920x1088设置为预览尺寸,我会得到这个致命的错误,它会自动重启应用程序:
致命信号11(SIGSEGV)位于0x417db2d9(代码= 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();
}
}
但即使使用回调缓冲区,问题仍然存在,图片被剥离。
我做错了吗?
由于
答案 0 :(得分:1)
回调缓冲区的大小是多少?是否足以拥有所有预览像素?
答案 1 :(得分:0)
据我所知,HTC G11有同样的问题(setPreviewSize超过1280x720)。
我建议改编HTC手机。如果他们使用HTC手机,请将setPreviewSize设置为640x480。