我正在创建图像预览,希望获得非常高的图片分辨率。但是,我不知道为什么,尽管Galaxy Nexus支持多种分辨率(我认为最大的分辨率是1920x1080,但我不记得这些分辨率是否准确),但保存图片时却显示来自预览的信息为320x240。
pixels.mCamera = getCameraInstance();
Camera.Parameters params = mCamera.getParameters();
List<Size> sizes = params.getSupportedPreviewSizes();
Size biggestSize = sizes.get(0);
double biggestPixels = biggestSize.width + biggestSize.height;
for (Size size : sizes) {
double pixels = size.width * size.height;
if (pixels > biggestPixels) {
biggestSize = size;
biggestPixels = pixels;
}
}
// At this point, biggestSize is 1920x1080
float ratio = ((float) biggestSize.width)
/ ((float) biggestSize.height);
params.setPreviewSize(biggestSize.width, biggestSize.height);
mCamera.setParameters(params);
setCameraDisplayOrientation(this, 0, mCamera);
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
LinearLayout innerWrapper = (LinearLayout) findViewById(R.id.innerWrapper);
LayoutParams layoutParams = (LayoutParams) innerWrapper
.getLayoutParams();
layoutParams.height = (int) (layoutParams.height * ratio);
innerWrapper.setLayoutParams(layoutParams);
preview.addView(mPreview);
innerWrapper
的内容是显示正方形图片。 setCameraOrientation
旋转图像以使其与比例对齐。拍照时,我使用自动对焦,然后...mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
mCamera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length, options);
Bitmap finalBitmap;
float ow = bitmap.getWidth();
float oh = bitmap.getHeight();
// At this point, ow and oh are 320 and 240
float ratio = ow / oh;
int fw, fh, x, y, angle;
//It continues, but irrelevant
...
这与我用来保存预览的
FrameLayout
的布局尺寸有关吗?因为我将其定义为350x350 dp,所以此预览应该更大。 最佳答案
傻我问题是我的PictureCallback
被实现为jpeg
参数,而不是raw
一个。引用documentation的位置:
当原始图像数据可用时,将发生原始回调(注意:
如果没有原始图像回调缓冲区,则数据将为null
可用或原始图像回调缓冲区不足以容纳
原始图片)。后视图回调发生在完全缩放后
已处理的后视图图像可用(注意:并非所有硬件都支持
这个)。压缩图像可用时,会发生jpeg回调。
将整个PictureCallback
移到mCamera.takePicture
的第二个参数而不是第三个参数将可以解决问题。但是,您需要使用CallbackBuffer
并更改代码以适应缓冲区的使用。因此,对于第一个版本,我将坚持使用低质量的图片。