视图到图像(分辨率更高)



我有一个视图,我想将其存储为图像(比如截图)。为此,我使用以下代码:

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);

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

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

是否可以获得更高分辨率的视图图像(每个设备的分辨率相同)?

在绘制到画布上之前,我尝试在视图上调用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);

也许需要很长时间才能更新天平。但我不知道如何在缩放完成时进行检查(而且缩放后的视图不应该渲染,因为当时它看起来完全错误)。

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

使用虚拟显示器可能会让你获得一致、标准化的视图"屏幕截图"。createVirtualDisplay根据您的需要设置显示w、h和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);

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

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

将视图包裹在ScrollView和HorizontalView中。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/sv"
android:layout_height="match_parent">
<HorizontalScrollView
android:layout_width="match_parent"
android:id="@+id/hsv"
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/share_preview"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<!--CONTENT-->
</FrameLayout>
</HorizontalScrollView>
</ScrollView>

在Runtime上将视图的宽度和高度设置为所需的大小。然后,不要从"视图"绘制位图,而是从"水平滚动视图"绘制。

View view = findViewById(R.id.share_preview);
view.setLayoutParams(new HorizontalScrollView.LayoutParams(1600,900));
HorizontalScrollView hsv = findViewById(R.id.hsv);
Bitmap b = Bitmap.createBitmap(hsv.getWidth(), hsv.getHeight(), 
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
hsv.draw(c);

您可以使用以下代码来获取

view.setDrawingCacheEnabled(true);
view.buildDrawingCache(true);
Bitmap bitmap = shareContainer.getDrawingCache();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(Environment.getExternalStorageDirectory() +File.separator+ "test.jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();

您可以使用">位图.createScaledBitmap(originalBitmap,newWidth,newHeight,false)"来缩放位图,但您只能在没有任何损失的情况下缩小大小,如果您试图放大,则图像将开始变模糊

最新更新