gpt4 book ai didi

java - Android自定义相机 - 在矩形内裁剪图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:39 27 4
gpt4 key购买 nike

我有一个自定义相机应用程序,它有一个居中的矩形 View ,如下所示:

Camera Screenshot

当我拍照时,我想忽略矩形之外的一切。该 View 与我的 XML View 中的 Camera Preview 或 SurfaceView 没有任何关系,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView
android:id="@+id/cameraview"
android:name="com.kut.camera.KutCameraFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

<View android:id="@+id/viewTamanho"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="400px"
android:layout_marginTop="300px"
android:layout_marginStart="70px"
android:layout_marginEnd="70px"
android:background="@drawable/border" />

<RelativeLayout
android:id="@+id/rel_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="1"
android:background="@android:color/black"
android:orientation="vertical"
android:padding="10dp" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/textViewReferan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Evidência"
android:textColor="@android:color/white"
android:textSize="16sp" />

<Button
android:id="@+id/button_exit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent"
android:text="Sair"
android:textColor="#2799CF" />
</RelativeLayout>

<LinearLayout
android:id="@+id/progress_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone" >

<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/islem_value_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Carregando..." />

</LinearLayout>
</LinearLayout>

<RelativeLayout
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:alpha="0.9"
android:background="@android:color/black"
android:padding="10dp" >

<ImageView
android:id="@+id/imageView_foto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/camera" />

<ImageView
android:id="@+id/imageView_photo"
android:layout_width="80dp"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_marginEnd="5dp"
android:padding="5dp"
android:scaleType="fitCenter"
android:src="@drawable/fotoicon" />
</RelativeLayout>
</RelativeLayout>
</FrameLayout>

有人可以帮我如何正确裁剪图像吗?我试图根据我的 XML 创建一个新的位图,但显然它没有用,比如:

Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
//.../
Bitmap imagemOriginal = BitmapFactory.decodeByteArray(data, 0, data.length);
Bitmap imagemCortada = Bitmap.createBitmap(imagemOriginal, 70, 400, imagemOriginal.getWidth() - 70,
imagemOriginal.getHeight() - 400);
//.../
}

我为 x 和 y 设置了这些初始值,并尝试从宽度和高度中减去(基于 View 中引用 marginTop、Bottom 等的 XML 值...)但我没有成功,因为我没有知道如何将 View 坐标与从相机获取的图像坐标相匹配。此外,在我看来 Bitmap.createBitmap 的裁剪效果有限,显然我无法将其直接裁剪为矩形。

最佳答案

要控制裁剪,必须控制图片大小和矩形大小。

a)选择与预览相同纵横比的图片尺寸非常重要,b)确保预览在屏幕上没有失真.如果您为各种设备准备您的应用程序,那么这两项任务都不是微不足道的。要实现后者,您需要同时控制预览大小和 SurfaceView 大小。我已经对此进行了更详细的解释 elsewhere .

为简单起见,我建议忽略可能具有自然横向方向的平板电脑。在手机上,即使将相机方向设置为纵向(仅影响预览),捕获的图像也会“旋转”90°。不要指望 setRotation()为您解决此问题:根据本书,允许简单地为捕获的图像设置 EXIF 标志。

您以 px 为单位设置 viewTamanho 的边距。这在各种屏幕上可能无法很好地扩展。我建议以编程方式设置此 View 的尺寸,作为预览表面的一定百分比。您可以使用 support library以 XML 定义它,但恐怕这不会给您足够的控制权。

有了这些,假设我们有 1280×720 的预览,2560×1440 的图片,我们的屏幕是 1280×800,矩形在中间,616×400 像素(或多或少)小于屏幕截图缩放的大小)。

屏幕上的实际预览大小可能为 1000x562,左右填充 79 像素的黑边距。然后下面的代码将产生预期的捕获图片:

public void onPictureTaken(byte[] data, Camera camera) {
//.../
Bitmap imagemOriginal = BitmapFactory.decodeByteArray(data, 0, data.length); // 2560×1440
float scale = 1280/1000F;
int left = (int) scale*(imagemOriginal.getWidth()-400)/2;
int top = (int) scale*(imagemOriginal.getHeight()-616)/2;
int width = (int) scale*400;
int height = (int) scale*616;
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(90);
Bitmap imagemCortada = Bitmap.createBitmap(imagemOriginal, left, top, width, height, rotationMatrix, false);
//.../
}

关于java - Android自定义相机 - 在矩形内裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462538/

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