查看图像(更高分辨率)

Phi*_*l90 2 android image bitmap

我有一个视图,我想将其存储为图像(例如截取它的屏幕截图)。为此,我使用以下代码:

View view = findViewById(R.id.share_preview);
Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
view.draw(c);
Run Code Online (Sandbox Code Playgroud)

然后我将位图存储到图库中。

问题是,保存的图像始终与视图具有相同的大小。由于视图的大小取决于手机屏幕的大小,因此图像在每个设备上的大小都不同。

是否有可能获得更高分辨率的视图图像(并且每个设备上的分辨率相同)?

我尝试过的是在绘制到画布上之前在视图上调用scaleX()和scaleY()。视图由此缩放,但图像仍然具有旧大小(我还更改了位图的大小)。代码如下所示:

View view = findViewById(R.id.share_preview);


// here's the difference
view.setScaleX(2);
view.setScaleY(2);


Bitmap b = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
view.draw(c);
Run Code Online (Sandbox Code Playgroud)

也许需要很长时间才能更新秤。但我不知道如何检查缩放何时完成(并且缩放视图也不应该被渲染,因为它看起来完全错误)。

dr_*_*r_g 5

对于这样的问题可能没有绝对的答案 - 您可能会意识到,在任何时候在给定设备上组合视图层次结构都涉及许多步骤,所有这些步骤都被渲染以优化其在给定设备上的布局,同时其他系统内容,例如侧边栏、键盘、工具栏等;全部在特定的屏幕分辨率、像素密度和其他显示属性下呈现。我现在还注意到,任何动态内容(例如文本输入)都很难用我概述的这种方法来捕获。

使用虚拟显示器可能会让您获得您所控制的视图的一致、标准化的“屏幕截图”。createVirtualDisplay根据您的需要设置显示宽、高和 dpi。并提供一个将在其上呈现内容的表面。

mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);

int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION | 
            DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;

mVirtualDisplay =  mDisplayManager.createVirtualDisplay("MyVirtualDisplay", 
    WIDTH, HEIGHT, DENSITY_DPI, surface, flags);
Run Code Online (Sandbox Code Playgroud)

表面需要提示被绘制(您可以连接到各种标准示例,例如演示文稿),并将您在设备上渲染的相同视图布局膨胀到虚拟表面上。您可以在最近渲染时将表面数据传递到位图。请参阅此处获取一些帮助:截图android演示显示/表面

最近,从 API 24 开始,PixelCopy可能会对此有所帮助。