MediaProjection 生成扭曲的屏幕截图

2024-04-30

我设法获得了屏幕截图,但结果是这样的:

原来的:

这是我从几个来源获取的代码:

final ImageReader ir = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
  VirtualDisplay vd= mediaProjection.createVirtualDisplay("screen", width, height, dpi, 
  DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, ir.getSurface(), null, null);

final String path=getActivity().getFilesDir().getAbsolutePath()+"/myscreen.jpg";
  ir.setOnImageAvailableListener(new OnImageAvailableListener() {

          //  @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = null;
                FileOutputStream fos = null;
                Bitmap bitmap = null;

                try {
                    image = ir.acquireLatestImage();
                    fos = new FileOutputStream( path);
                    final Image.Plane[] planes = image.getPlanes();
                    final Buffer buffer = planes[0].getBuffer().rewind();
                    bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                    bitmap.copyPixelsFromBuffer(buffer);
                    bitmap.compress(CompressFormat.JPEG, 85, fos);
                    image.close();

                } catch (Exception e) {
                    e.printStackTrace();
             ........
             ........

这是你的位图的宽度和高度不对——至少你扭曲的图像看起来就像我所看到的一样。这是我如何让它发挥作用的。

int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * imageReader.getWidth();
bitmap = Bitmap.createBitmap(imageReader.getWidth() + rowPadding / pixelStride,
                        imageReader.getHeight(), Bitmap.Config.ARGB_8888);

使用 imageReaders 宽度/高度(而不是图像)很重要。

创建 imageReader/virtualDisplay 对象时,我使用以下方法来获取显示指标。

   public static DisplayMetrics getScreenMetrics(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        Display display = wm.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        display.getMetrics(dm);

        return dm;
    }

...
ImageReader imageReader = ImageReader.newInstance(displayMetrics.widthPixels, displayMetrics.heightPixels, PixelFormat.RGBA_8888, 2);

我从反复试验中学到了这一点,所以我很抱歉无法解释原因。

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

MediaProjection 生成扭曲的屏幕截图 的相关文章

随机推荐

  • 使用接口将泛型委托转换为另一种类型

    使用 NET 4 0 好的 所以我有 private Dictionary
  • flink - 使用匕首注入 - 不可序列化?

    我使用 Flink 最新通过 git 从 kafka 流式传输到 cassandra 为了简化单元测试 我通过 Dagger 添加依赖注入 ObjectGraph 似乎已正确设置自身 但 内部对象 被 Flink 标记为 不可序列化 如果我
  • Angular 2/4 存储令牌的位置

    我有一个用于生成令牌的 REST API 我在 Angular 4 客户端中使用它 但问题是在哪里存储该令牌 在互联网上我发现我可以存储在本地存储或cookie中 所以我的问题是 如果存储令牌是本地存储 并且我刚刚从另一个浏览器复制了有效令
  • 如何使用 Jetty 提供 JSP 文件?

    我嵌入了 jetty 提供单个 servlet 和一些静态内容 我从下载了码头http download eclipse org jetty 7 4 5 v20110725 dist http download eclipse org je
  • 如何创建基本时间戳或日期? (Python 3.4)

    作为初学者 创建时间戳或格式化日期最终比我预期的更具挑战性 有哪些基本的例子可供参考 最终 您希望查看日期时间文档并熟悉格式化变量 但这里有一些示例可以帮助您入门 import datetime print Timestamp Y m d
  • VS CODE 中的 WEBGL 自动完成

    我有一个学校项目 我需要使用 WEBGL 但是在没有自动补全的情况下编写所有代码是相当困难的 我没有找到合适的扩展名 你有想法吗 为了让 Visual Studio 代码能够自动完成 它需要知道变量的类型 例如 如果你有这个 const g
  • 密码恢复:如何解密 md5 加密的密码? [复制]

    这个问题在这里已经有答案了 可能的重复 是否可以解密 md5 哈希值 https stackoverflow com questions 1240852 is it possible to decrypt md5 hashes 在我的网站中
  • switch 语句里面有 switch 语句?

    我必须评估很多条件 就我而言 我必须做这样的事情 switch id case 5 switch some other cases here case 6 set some value 在情况 5 中再进行一次切换是个好习惯吗 如果不是 那
  • 排除测试的 Maven 依赖

    我有编译和运行时所需的依赖项 但我想在运行测试时排除它 这可能吗 也许 通过设置个人资料 但我如何仅停用它test生命周期阶段 您可以在测试阶段 重新 配置类路径 这要归功于Maven Surefire 插件 http maven apac
  • Visual Studio 2015 Docker 集成不会附加调试

    我使用 VS 2015 创建了一个 Default net Core RC2 MVC 应用程序 我添加了 Docker 支持 以便我可以在 docker 中运行和调试它 当我运行该项目时 它会构建 docker 容器并启动它 运行命令 do
  • Biztalk 2009 和 2010 .btproj 项目中的增量构建支持吗?

    在追求增量构建时间改进时 我发现 btproj 文件以及依赖于这些文件的所有其他项目都会在每个增量构建上 部分 重建 一直跟踪到 BizTalkCommon targets 我发现它对程序集进行了 2 遍编译 但只有第一遍尊重已经构建的工件
  • 对登录 Instagram 的 PhantomJS 代码进行故障排除

    我编写了这个 PhantomJS 脚本来自动登录 Instagram 它可以成功填写表单字段并按提交按钮 但它总是被重定向回登录屏幕并显示以下消息 你的用户名或密码不正确 我 100 确信凭据是正确的 并且我用多个 Instagram 帐户
  • d3.js 和 Chart.js 之间的比较(仅适用于图表)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在项目中多次使用过 Chart js 但从未使用过 d3 js 很多人说 d3 js 是最好的图表 javascript 框架 但没
  • 如何获取 Highcharts 中某个点的索引?

    我正在使用 Highcharts 的 具有不规则间隔的时间数据 图表 如您所知 当鼠标移动到线条点上时 格式化程序函数将运行并显示一些信息 我想知道鼠标在其上移动的点的索引 因此 如果鼠标移动到该线的第一个点上 工具提示将显示 1 第二个点
  • 为什么不能直接访问带索引的数组?

    当我尝试直接使用索引访问数组元素时 我感到很困惑 我想我可以在编码中更好地解释它 我有一个 Employee 类的对象 我将其 TypeCast 到数组并尝试像这样显示它 arrOfObj array objEmployee arrKeys
  • windows bat 文件中的 bang 字符是什么意思?

    我正在尝试更正一个使用 bang 字符的 bat 文件 我本来期望某种形式的引用 就像是 set some var some var 然后后来 some command some var 看起来第一个是在禁用回显的情况下提示输入 例如提示输
  • Django 压缩器和模板继承

    我正在使用Django 压缩器 https github com mintchaos django compressorDjango 1 2 3 中的 app 用于缩小和合并许多包含的 CSS 和 JS 文件 在基本模板中 我有 load
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • 比较 boost::system::error_category

    对于 errorCode category name 输出 asio misc 和 errorCode message 输出 文件结束 的错误 以下比较失败 如果它声称属于 asio misc 类别 那么为什么 errorCode cate
  • MediaProjection 生成扭曲的屏幕截图

    我设法获得了屏幕截图 但结果是这样的 原来的 这是我从几个来源获取的代码 final ImageReader ir ImageReader newInstance width height PixelFormat RGBA 8888 2 V