截图 相机视图+布局视图 android 增强现实

Posted

技术标签:

【中文标题】截图 相机视图+布局视图 android 增强现实【英文标题】:taking screenshot camera view+layout view android augmented reality 【发布时间】:2012-11-13 22:50:35 【问题描述】:

我尝试从帧缓冲区截屏,它适用于我的布局视图 我使用了here的以下代码:

String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND;   

// create bitmap screen capture
Bitmap bitmap;
View v1 = mCurrentUrlMask.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

OutputStream fout = null;
imageFile = new File(mPath);

try 
    fout = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
    fout.flush();
    fout.close();

 catch (FileNotFoundException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

但我想用相机视图捕捉布局视图,因为我也在布局视图或透明网页的背景中使用相机视图。 一种解决方法是分别拍摄相机图像和布局视图并将它们放在一起并保存新的位图。

谁能建议我任何适当的解决方案? 提前致谢

【问题讨论】:

相机打开时如何拍照?实际上我需要在屏幕中打开相机时进行屏幕截图/ @mrYogi:你有什么解决办法吗? 【参考方案1】:

为了将两个图像放在一起,您可能希望按照此代码 100% 工作以将两个图像叠加在一起

 Bitmap border = BitmapFactory.decodeResource(getResources(), R.drawable.vignette2);
int width = bmp.getWidth();
int height = bmp.getHeight();
change = Bitmap.createScaledBitmap(change, width, height, false); // change is Bitmap
Canvas canvas = new Canvas(change);
Bitmap scaledBorder = Bitmap.createScaledBitmap(border,width,height, false);
canvas.drawBitmap(scaledBorder, 0, 0,null);
//canvas.drawBitmap(k, 0, 0, null);
view.setImageBitmap(change); // view is the imageView

现在部分保存视图,简单的方法是

view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        save = view.getDrawingCache(); // save is a Bitmap

然后:

                final FileOutputStream out = new FileOutputStream(file);
            save.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
            out.close();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://"
                            + Environment.getExternalStorageDirectory())));
            Toast.makeText(getApplication(), "Image Saved",
                    Toast.LENGTH_SHORT).show();

这将为您保存 imageview 的视图,或者如果它的 Layout 则只需设置您的布局并为其命名,然后将其替换为 view 并且在你检查保存是否成功后请不要忘记设置

        view.setDrawingCacheEnabled(false); 

【讨论】:

感谢您的快速回复,但是有什么方法可以在后台运行相机的情况下捕获屏幕截图? 啊刚刚想起一件事。只需将您的保存方法传递给受保护的 void onPause() super.onPause();保存(); 现在,当您的应用在后台时,它将继续执行保存方法! 你误会我的意思了,“在后台”是指背景中的相机视图和透明视图,在这种情况下截屏。 在这种情况下我猜你需要 FrameLayout 来完成这个。只需将两个布局叠加在一起,如果您有单独的布局,那么就在您的 mainlayout 中。添加 framelayout 由 组成,您可以调整它的宽度和高度以将其放在主布局中的任何位置。或者只是简单地将高度和宽度设置为fill_parent,它将覆盖主布局,您仍然可以看到主布局。如果你看不到它,然后添加框架布局, android:alpha="0.4" 它将是透明的。希望能给你一个想法。 我在上一个活动中运行相机,在第二个活动中在透明活动中运行透明 webview.. 一切顺利,但我一次只能获得一个视图,无论是 cameraframe 还是 webview,有没有办法将屏幕截图捕获为它显示在设备屏幕上(透明的 webview 和 cameraview 下面)。【参考方案2】:

我无法将代码发布为评论,所以你去吧 您是否可以在您的 onActivtity 上传递该特定方法,或者在您发送意图后传递它,或其自定义相机然后您可以控制当您单击相机按钮时只需添加一个方法来捕获视图。这是我保存视图的方法。

void Save() 
    if (null != view.getDrawable()) 
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        save = view.getDrawingCache();
        final File myDir = new File(folder);
        myDir.mkdirs();
        final Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        final String fname = "StyleMe-" + n + ".png";
        final File file = new File(myDir, fname);
        if (file.exists())
            file.delete();
        try 
            final FileOutputStream out = new FileOutputStream(file);
            save.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
            out.close();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://"
                            + Environment.getExternalStorageDirectory())));
            Toast.makeText(getApplication(), "Image Saved",
                    Toast.LENGTH_SHORT).show();
         catch (final Exception e) 
            Toast.makeText(getApplication(),
                    "Something Went Wrong check if you have Enough Memory",
                    Toast.LENGTH_LONG).show();
        
     else 
        final Toast tst = Toast.makeText(getApplication(),
                "Please Select An Image First", Toast.LENGTH_LONG);
        tst.setGravity(Gravity.CENTER, 0, 0);
        tst.show();
    
    view.setDrawingCacheEnabled(false);

为了让您不断保存视图,然后只需添加循环。当您单击循环开始的相机按钮时!在我的保存方法中,不要担心覆盖名称:)。它将随机生成每个图像的名称!

【讨论】:

以上是关于截图 相机视图+布局视图 android 增强现实的主要内容,如果未能解决你的问题,请参考以下文章

当相机在Android中的表面视图上以编程方式截屏

Android:如何不重叠动态视图? +视图的动态位置

相机视图 SurfaceView 仅以横向存储

Android中线性布局的透明视图

Android - 如何使用视图布局尺寸裁剪 jpeg

Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图