android– 截取SurfaceView的截图

概述我正在开发一个简单的相机应用我有代码截取整个活动的截图并将其写入Sd卡.问题是Surfaceview返回黑屏.我想知道如何独立拍摄surfaceview的截图.这是获取整个活动屏幕截图的代码.findViewById(R.id.screen).setOnClickListener(newOnClickListener(){@Override

我正在开发一个简单的相机应用我有代码截取整个活动的截图并将其写入Sd卡.问题是SurfacevIEw返回黑屏.

我想知道如何独立拍摄surfacevIEw的截图.
这是获取整个活动屏幕截图的代码.

    findVIEwByID(R.ID.screen).setonClickListener(new OnClickListener() {      @OverrIDe     public voID onClick(VIEw v) {     final relativeLayout layout = (relativeLayout) findVIEwByID(R.ID.relativeLayout1);      layout.setVisibility(relativeLayout.GONE);       Bitmap bitmap = takeScreenshot();        Toast.makeText(getApplicationContext(),"Please Wait",         Toast.LENGTH_LONG).show();       saveBitmap(bitmap);   }});}      public Bitmap takeScreenshot() {       VIEw rootVIEw = findVIEwByID(androID.R.ID.content).getRootVIEw();       rootVIEw.setDrawingCacheEnabled(true);       return rootVIEw.getDrawingCache();    }           public voID saveBitmap(Bitmap bitmap) {         final MediaPlayer cheer = MediaPlayer.create(PicShot.this, R.raw.shutter);       cheer.start();        Random generator = new Random();      int n = 10000;       n = generator.nextInt(n);        String fname = "Image-"+ n +".png";      final relativeLayout layout = (relativeLayout)     findVIEwByID(R.ID.relativeLayout1);     file imagePath = new file(Environment.getExternalStorageDirectory() + "/" + fname);     fileOutputStream fos;      try {        fos = new fileOutputStream(imagePath);        bitmap.compress(CompressFormat.PNG, 100, fos);        fos.flush();        fos.close();        layout.setVisibility(relativeLayout.VISIBLE);        Intent share = new Intent(Intent.ACTION_SEND);        share.setType("image/*");        Uri uri = Uri.fromfile(imagePath);        share.putExtra(Intent.EXTRA_STREAM,uri);        startActivity(Intent.createChooser(share, "Share Image"));    } catch (fileNotFoundException e) {        Log.e("GREC", e.getMessage(), e);    } catch (IOException e) {        Log.e("GREC", e.getMessage(), e);    }}

解决方法:

SurfaceVIEw的表面独立于绘制VIEw元素的表面.因此捕获VIEw内容将不包括SurfaceVIEw.

您需要单独捕获SurfaceVIEw内容并执行自己的合成步骤.捕获的最简单方法可能是重新渲染内容,但使用屏幕外位图作为目标而不是表面.如果您使用GLES渲染到屏幕外的pbuffer,则可以在交换缓冲区之前使用glreadPixels().

更新:Grafika’s“相机纹理”活动演示如何使用OpenGL ES处理来自相机的实时视频. EglSurfaceBase#saveFrame()显示如何将GLES渲染捕获到Bitmap.

更新:另请参阅this answer,其中提供了更多背景信息.

总结

以上是内存溢出为你收集整理的android – 截取SurfaceView的截图全部内容,希望文章能够帮你解决android – 截取SurfaceView的截图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1103532.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存