在 Android 相机中拍摄的照片比预期的要小

Posted

技术标签:

【中文标题】在 Android 相机中拍摄的照片比预期的要小【英文标题】:Photos taken are smaller than expected in Android camera 【发布时间】:2013-04-07 07:34:14 【问题描述】:

我创建了自己的控制器来使用安卓相机拍照。我的问题是输出显示的图像比预期的要小。我已经像这样检查了位图的宽度和高度:

int w = bmp.getWidth();
int h = bmp.getHeight();

这会输出w = 480h = 640,我假设它们是以像素为单位的大小。这是我的拍照方法

public void takePicture() 
        Log.i("Camera View: ", "Take Picture");
        camera.takePicture(null, null, new PictureCallback() 
            @Override
            public void onPictureTaken(byte[] data, Camera camera) 
                if (null != callback) 
                    callback.onJpegPictureTaken(data, camera);

                
            
        );
 

我的Activity 订阅了这个事件onJpegPictureTaken

    @Override
    public void onJpegPictureTaken(byte[] data, Camera camera) 
        Intent i = new Intent(this, ImageEditing.class);
        i.putExtra("image", data);
        startActivity(i);
    

这样做的目的是启动一个新的Activity 以编辑图像,例如缩放和拖动。这个 ImageEditing.class 得到这样的图片:

flipped = flipByteArrayNintyDegress(getIntent().getExtras()
                .getByteArray("image"));

        Bitmap bmp = BitmapFactory.decodeByteArray(flipped, 0, flipped.length);
        image = (ImageView) findViewById(R.id.imageView1);
        image.setImageBitmap(bmp);
        image.setOnTouchListener(this);

我一开始以为我的ImageView由于ImageView的高度和宽度有一些限制,但事实并非如此。这是布局 XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_
        android:layout_
        android:scaleType="matrix"/>

</FrameLayout>

这是我捕获图像时的结果

有人知道这里发生了什么吗?为什么要缩放图像?

【问题讨论】:

你的图片太棒了 【参考方案1】:

返回到onJpegPictureTaken()data 旨在作为缩略图表示。您将收到getSupportedJpegThumbnailSizes() 在Camera.Parameters 中报告的尺寸之一。您的相机中没有足够的堆内存来通过byte[] 数组发送整个全分辨率图像,甚至压缩/编码为 Jpeg 图像。因此,发送缩略图是一种快速预览结果的方式。您必须找到图像的存储位置才能以全分辨率访问它。

此外,即使这样,您也必须使用BitmapFactory.Options 中的比例因子打开它,以便将其内存作为Bitmap

还要检查Camera.Parameters 上的setPictureSize(),并检查getSupportedPictureSizes() 支持的可用尺寸。


让 Android 为你拍照

您可以使用以下示例使 Android 系统相机应用程序拍摄一张全分辨率照片并返回到您的Activity:Allow user to select camera or gallery for image。您的Activity 将可以访问相机捕获的全分辨率保存的图像文件。

为了以全分辨率翻转或旋转此图像(无法以 Bitmap 的大小打开),您可以修改描述 AFine 转换的 EXIF 数据。这不会修改实际的像素数据,但会改变它在大多数系统上的显示方式。这个网站上有几个关于如何读写 EXIF 数据的例子,但我目前没有可用的代码例子。

【讨论】:

所以我需要把图片保存在onJpegPictureTaken()里面? 没有。那将无济于事。无论你用它做什么,你在那个函数中得到的缩略图数据都不会变大。您可以使用setPictureSize() 使其更大,但不会更大。【参考方案2】:

flipByteArrayNintyDegress 的实现呢?

/亚伦

【讨论】:

输出分辨率和输入res一样。

以上是关于在 Android 相机中拍摄的照片比预期的要小的主要内容,如果未能解决你的问题,请参考以下文章

在vue中,更新和nextTick中获取元素的大小比预期的要小?

避免图库保存在Android中使用相机拍摄的照片

Android:BroadcastReceiver 意图检测拍摄的相机照片?

Android:是不是可以在启动它的同一活动中使用从相机拍摄的照片?

Android:保存用户使用相机拍摄的照片

Android笔记67Android之使用系统中的相机功能(拍照保存照片显示拍摄的照片照片保存到图库等操作)