在相机上叠加图像预览

2024-01-27

介绍

我有一个自定义相机应用程序,我在其中通过自定义 SurfaceView 显示相机预览。我需要实现的是,从图像资源创建覆盖图像,该图像将显示在cameraPreview 上,例如滤镜。

我一直在不同的主题中搜索这个问题,但我还没有找到适用于我的应用程序的内容。

APPROACH

我一直在尝试使用 onDraw() 方法和其他选项将图像设置为位图,但我还没有实现显示图像。

这是我的代码:

CODE

public class CameraActivity extends Activity implements PictureCallback {

    private Button btnPhoto;
    CameraPreview cameraPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        cameraPreview = (CameraPreview) findViewById(R.id.camera_preview);
        btnPhoto = (Button)findViewById(R.id.buttonTakePhoto);

        btnPhoto.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                takePhoto();
            }
        });
    }

    public void takePhoto() {
        cameraPreview.getCamera().takePicture(null, null, this);
    }
    //...
}

_

public class CameraPreview extends FrameLayout implements SurfaceHolder.Callback {

    private SurfaceView surfaceView;
    private Camera camera;

    public CameraPreview(Context context, AttributeSet attrs) {
        super(context, attrs);

        createCamera();

        surfaceView = new SurfaceView(context);
        addView(surfaceView);

        SurfaceHolder holder = surfaceView.getHolder();
        holder.addCallback(this);

        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.setKeepScreenOn(true);
    }

    private void createCamera() {
        //...
            try {
                this.camera = Camera.open(activeCameraId);
            } catch (Exception e) {
                return;
            }
        //...
    }

    public Camera getCamera() {
        return camera;
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //...
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //...
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //...
    }
}

_

<com.uax.cameratakephoto.CameraPreview
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true" />

<Button  //THIS IS THE BUTTON TO TAKE THE PHOTO
    android:id="@+id/buttonTakePhoto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:background="@android:drawable/ic_menu_camera" />

<ImageView  //THIS IS A SMALL PREVIEW OF THE LAST PHOTO TAKEN
    android:id="@+id/imageView"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" />

做这样的事情 通过扩展SurfaceView创建相机预览类

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;
    private String TAG = "CameraPreview";

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the
        // preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            // ignore: tried to stop a non-existent preview
        }
        mCamera.release();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null) {
            // preview surface does not exist
            return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        StartPreview();
    }

    public void StartPreview() {
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}

然后在你的活动中 声明预览对象并初始化相机对象

private CameraPreview preview;

在那之后

   // Create our Preview view and set it as the content of ur activity.
    preview = new CameraPreview(this, camera);

    // Create Frame layout
    FrameLayout previewLayout = new FrameLayout(this);

    // Create camera layout params
    LinearLayout.LayoutParams previewlayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,    LinearLayout.LayoutParams.MATCH_PARENT, Gravity.LEFT);

// Add preview to previewLayout
previewLayout.addView(preview, 0);

Bitmap overlayBitmap = getBitmap();
if (overlayBitmap != null) {
Matrix matrix = new Matrix();
matrix.postRotate(180);

Bitmap rotatedBitmap = Bitmap.createBitmap(overlayBitmap, 0, 0, overlayBitmap.getWidth(),
overlayBitmap.getHeight(), matrix, true);

ImageView oImageView = new ImageView(this);
oImageView.setImageBitmap(rotatedBitmap);
previewLayout.addView(oImageView, 1);
}

// Add previewLayout to main layout
linearLayout.addView(previewLayout, previewlayoutParams);

那是它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在相机上叠加图像预览 的相关文章

随机推荐

  • Azure DocumentDB 多租户架构

    我一直在预览期间将 DocumentDB 实现到多租户系统中 我的计划是在 DocumentDB 帐户下为每个注册的租户生成一个新数据库 大部分代码已经就位 并且测试进展非常顺利 由于 DocumentDB 已正式发布并且文档已最终确定 我
  • 使用 JavaScript 将 HTML 字符串加载到 iframe 中

    我有一串 HTML 标签 可以随时添加或更改 是否可以在运行时将该字符串加载到 Iframe 中 就好像它是 HTML 文件一样 这是针对构造 2 的 我有一个可以从 url 加载 HTML 的对象 它还可以插入 HTML 并运行脚本 但不
  • Flutter 毫不延迟地导航到屏幕

    我有一个登录屏幕 在我的表单按钮中 我进行检查 然后调用共享首选项来设置登录标志 并且 initState 我调用一个方法来检查值并重定向到主屏幕 现在一切都很顺利 但我能够看到登录表单一秒钟左右 然后我被重定向到主页 我希望根本看不到登录
  • 使用 YAML-CPP 将 YAML Emitter 内容保存到文件中

    我刚刚开始使用 yaml cpp 我设法正确构建它并运行 yaml cpp wiki 中的一些示例 但我找不到将发射器保存到文件的方法 这不可能吗 我的意思是 PyYAML 库有一个 转储 功能 yaml cpp中没有这样的功能吗 是否有一
  • Xcode 4.4 - 存在内部 API 错误

    您好 我刚刚升级到 Mountain Lion 我创建了一个空的单视图应用程序并运行它 第一次运行良好 但接下来的运行会给我 有一个内部 API错误 弹出警告两次 这与我的其他项目相同 它们一次运行正常 但在下一次运行时出现此错误 没有任何
  • PHP 会话变量足以进行用户身份验证吗?

    设想 用户登录后 将设置一个会话变量来确认其登录 在每个页面的顶部 登录会话变量被确认有效 如果不是 他们就会被踢出局 不使用持久性 cookie 仅使用session 问题 这是一个足够强大的安全措施本身 还是我应该 设置两个会话变量以验
  • 参考错误:未使用 nextjs 定义导航器

    我的代码是这样的 从 react 导入 React useEffect import alanBtn from alan ai alan sdk web const alanKey my key const App gt useEffect
  • UIScrollView 内的动态 UILabel 内容

    我有一个 UILabel 以及其他控件 存储在 UIScrollView 中 我想动态填充 UILabel 以便它自动扩展其高度以适应其内容 我只是想知道调整 UILabel 大小同时确保其父 UIScrollView 也将扩展其可滚动区域
  • Symfony2/FOSUserBundle - 多个捆绑包的路由问题

    如同this https stackoverflow com q 9826370 399584问题 我需要为我的网站的管理和前端包单独登录 管理实际上是一个单独的包 位于vendors 现在 我的路由如下所示 应用程序 配置 路由 yml
  • MVVMCross Binding 导致 Android 应用程序崩溃

    我有一个基于 Xamarin 和 MvvmCross 的 Android 应用程序 在该应用程序中 有一个带有我自己创建的 ExpandableListView 的视图 现在 此列表显示几个项目 这些项目使用 MvvmCross 绑定到其
  • 无法在 SQL Server 中的 ROW_NUMBER() 中使用别名?

    使用 sql 时 我必须创建一个按分组总和排序的 row number 列 select Sales Name SUM Sales Bill as billsum ROW NUMBER over order by billsum DESC
  • 如何建立简单的评审和5星评级系统? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对网络技术非常陌生 这基本上是我的团队正在研究的一个学期项目 我们正在开发一个食品评论网站 到目前为止 我不太确定如何实现一个简单的
  • 如何使用最新的 java sdk 3.1.2 在 couchbase 中执行批量插入

    我能够使用旧版本的 java sdk 例如 2 9 7 使用以下代码执行批量插入 public void insertAll 集合文档 Observable from documents flatMap new Func1
  • Django Rest Framework,超链接嵌套关系

    我有两个模型 User and Ticket Ticket有一个User User有很多Tickets 当我访问 url 时我已经完成了 用户 1 门票 我正在获取用户的门票列表 我想使用超链接关系 这是我在用户模型表示中看到的内容 tic
  • 将超级对撞机与 python 结合使用

    我想做一些实时声音处理 我听说超级对撞机 http supercollider sourceforge net 它看起来很棒 但我想坚持使用 python 因为 正常 编程是问题所在 有没有办法将 python 脚本作为模块加载到超级对撞机
  • 如何在ransack上设置带有字段名称的默认条件?

    我有一个用户和一个角色模型 两者都通过 habtm 关联 并且有一个与角色关联的论坛模型 在论坛的搜索表单中 我想按具有特定角色 按名称 版主 的用户进行过滤 来源看起来像这样 class User lt ActiveRecord Base
  • SQL:GROUP BY 之后的 SUM

    样本表 CustomerId VoucherId CategoryId StartDate EndDate 10 1 1 2013 09 01 2013 09 30 10 1 2 2013 09 01 2013 09 30 11 2 1 2
  • MongoDB C# 驱动程序:忽略插入属性

    我正在使用官方 MongoDB C Drive v0 9 1 26831 但我想知道给定一个 POCO 类 是否有办法忽略插入时的某些属性 例如 我有以下课程 public class GroceryList public string N
  • 如何链接到 Xcode 中的特定框架版本?

    我有一个链接到 OS X 的 Python framework 的应用程序 由于 Snow Leopard 已升级到 Python 2 6 该框架现在包含 2 4 2 5 和 2 6 的版本 不过 我的程序似乎不想链接到 2 6 当我尝试使
  • 在相机上叠加图像预览

    介绍 我有一个自定义相机应用程序 我在其中通过自定义 SurfaceView 显示相机预览 我需要实现的是 从图像资源创建覆盖图像 该图像将显示在cameraPreview 上 例如滤镜 我一直在不同的主题中搜索这个问题 但我还没有找到适用