gpt4 book ai didi

Android Camera 为某些用户拍摄了多行错误的照片

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:29 31 4
gpt4 key购买 nike

  1. 我的应用程序的一些用户正在拍摄一些看起来像这样的错误照片:

enter image description here

我唯一做的就是 jpegCallback 中的标准位图 API:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
bm = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
bm = Bitmap.createScaledBitmap(bm , 640, 480, true);

然后写入磁盘

 imageFile = new File("/sdcard/app_dir/upload.jpg");
FileOutputStream outStream = new FileOutputStream(imageFile);
bm.compress(CompressFormat.JPEG, 75, outStream);
outStream.flush();
outStream.close();
  1. 编辑:我已经删除了对 setPreviewSize 的调用,就像在此处解释的那样: Android: Jpeg saved from camera looks corrupted

我认为它确实对一些用户有帮助 (Desire HD),但我可以告诉其他人仍然遇到问题 (Desire S)。

我真的希望有人能解释一下图片看起来失真的原因。

最佳答案

我无法告诉您为什么您会从某些设备而不是其他设备获得乱码数据,但我可以建议一种似乎对我的应用成功运行的解决方法。

您的示例代码将相机的 JPEG 缩小到 640x480,然后再将其保存到 SD 卡。所以我猜你不需要全尺寸相机图像。

如果这个假设成立,您可以完全跳过 Camera 的 takePicture() API,只将预览帧保存到 SD 卡。最简单的方法是使用 setOneShotPreviewCallback():

mCamera.setOneShotPreviewCallback( new StillPictureCallback() );

这将调用一次,并从相机中返回一个数据缓冲区:

private class StillPictureCallback implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
mPictureTask = new SaveStillPictureTask();
byte[] myData = null;
if ( data != null ) {
myData = data.clone();
}
mPictureTask.execute(myData);
}
}

回调调用后台任务来压缩数据并将其保存到文件中。我唯一遗漏的代码是通过 getCameraInfo() 向相机查询预览帧格式、宽度和高度的部分。另请注意,Android YUVImage 类是随 Froyo 引入的,因此如果您需要支持早期版本的 Android,则需要滚动自己的转换代码(StackOverflow 上有此处示例)。

/**
* Background task to compress captured image data and save to JPEG file.
*
*/
private class SaveStillPictureTask extends AsyncTask<byte[], Void, Void> {

private static final String TAG="VideoRecorder.SaveStillPictureTask";

@Override
protected Void doInBackground(byte[]... params) {
byte[] data = params[0];
FileOutputStream out = null;
Bitmap bitmap = null;
if ( data == null ) {
Log.e(TAG, "doInBackground: data is null");
return null;
}

try {
out = new FileOutputStream(mSnapshotFilePath);

// Use the preview image format, as documented in Android SDK javadoc
if ( (mPreviewImageFormat == ImageFormat.NV21) || (mPreviewImageFormat == ImageFormat.YUY2) ) {
saveYUVToJPEG( mCamera, out, data );
} else if (mPreviewImageFormat == ImageFormat.JPEG) {
Log.d(TAG, "directly write JPEG to storage");
out.write(data);
} else {
Log.d(TAG, "try decoding to byte array");
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
if ( bitmap != null ) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
} else {
Log.e(TAG, "decodeByteArray failed, no decoded data");
}
}
}
catch (FileNotFoundException ignore) {;}
catch (IOException ignore) {;}
finally {
if ( out != null ) {
try {
out.close();
} catch (IOException ignore) {;}
out = null;
}
if ( bitmap != null ) {
bitmap.recycle();
bitmap = null;
}
data = null;
}

return null;
}
}

/**
* Save YUV image data (aka NV21 or YUV420sp) data to JPEG file.
*
* @param camera
* @param out
* @param data
*/
protected void saveYUVToJPEG( Camera camera, FileOutputStream out, byte[] data ) {
YuvImage yuvimg = null;
try {
int width = mPreviewWidth;
int height = mPreviewHeight;

Rect rect = new Rect();
rect.left = 0;
rect.top = 0;
rect.right = width - 1;
rect.bottom = height - 1; // The -1 is required, otherwise a buffer overrun occurs
yuvimg = new YuvImage(data, mPreviewImageFormat, width, height, null);
yuvimg.compressToJpeg(rect, 90, out);
} finally {
yuvimg = null;
}
}

关于Android Camera 为某些用户拍摄了多行错误的照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469019/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com