我该如何在程序中以编程方式对Google map v2和xml布局进行截屏/合并截屏?

9

我正在使用这个答案的代码截取 Google Map v2 的屏幕截图,输出如下:

enter image description here

这可以用来截取地图的屏幕截图。

使用以下代码,我可以截取黑色地图屏幕的布局屏幕截图,因为使用以下代码后,截屏中的地图将会是黑色的。

String mPath = Environment.getExternalStorageDirectory().toString()
                + "/" + "myTestScr" + System.currentTimeMillis() + ".jpeg";
Bitmap bitmap;
        View v1 = (View) findViewById(R.id.rootviewtest);
        v1.setDrawingCacheEnabled(true);
        bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

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

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

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

以上代码的输出:

enter image description here

我实际需要的是:

enter image description here

那么我的问题是如何以编程方式获得第三个屏幕中的输出?

请帮助我通过合并两个(1和2)屏幕的截图来获取截图 programmatically

或者在拍摄两个(1和2)屏幕截图后,是否有任何其他替代方法可以以编程方式合并这两个图像?


请不要使用代码格式作为强调。该格式样式适用于内联代码,而不是用于强调。 - Charles
2个回答

21

调用以下方法以获取带有地图的屏幕截图:

public void captureMapScreen() {
        SnapshotReadyCallback callback = new SnapshotReadyCallback() {

            @Override
            public void onSnapshotReady(Bitmap snapshot) {
                try {
                    mView.setDrawingCacheEnabled(true);
                    Bitmap backBitmap = mView.getDrawingCache();
                    Bitmap bmOverlay = Bitmap.createBitmap(
                            backBitmap.getWidth(), backBitmap.getHeight(),
                            backBitmap.getConfig());
                    Canvas canvas = new Canvas(bmOverlay);
                    canvas.drawBitmap(snapshot, new Matrix(), null);
                    canvas.drawBitmap(backBitmap, 0, 0, null);
                    FileOutputStream out = new FileOutputStream(
                            Environment.getExternalStorageDirectory()
                                    + "/MapScreenShot"
                                    + System.currentTimeMillis() + ".png");

                    bmOverlay.compress(Bitmap.CompressFormat.PNG, 90, out);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        mMap.snapshot(callback);

    }

mview是您布局的根视图,mMap是地图片段。

确保您拥有最新的Google Play服务 API。

mView.setDrawingCacheEnabled(true);
Bitmap backBitmap = mView.getDrawingCache();
Bitmap bmOverlay = Bitmap.createBitmap(
backBitmap.getWidth(), backBitmap.getHeight(),
backBitmap.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(snapshot, new Matrix(), null);
canvas.drawBitmap(backBitmap, 0, 0, null);
跳过这些行,如果您只想要地图的截图,请使用snapshot.compress(Bitmap.CompressFormat.PNG, 90, out);

1
请确保您使用的是 android.graphics.Matrix 而不是 android.opengl.Matrix - JiTHiN
1
在我交换了这两个的顺序之后,它对我起作用了 canvas.drawBitmap(snapshot, new Matrix(), null); canvas.drawBitmap(backBitmap, 0, 0, null); - Anjula
onSnapshotReady(Bitmap snapshot) 在主线程上调用吗? - Muhammad Babar
在我的情况下,我不得不添加屏幕高度“getWindow().getWindowManager().getDefaultDisplay().getHeight();”和宽度“getWindow().getWindowManager().getDefaultDisplay().getWidth();”,分别作为位图的高度和宽度。以防万一有人遇到同样的问题。 :D - neaGaze
我正在使用这个方法,它可以很好地截取地图的屏幕截图,但实际上我也想在屏幕截图中包含标记,但是我没有得到标记。 - Mehul Tank
你真的让我的一天都变得美好 <3 - Mahmoud Ayman

0

我不知道Android API,但既然您请求“替代”方法,我建议使用ImageMagick。在那个网站上有几个二进制文件,因此我希望您可以下载一个适合您的系统。否则,您可以下载源代码(搜索一下谷歌,您会找到许多有关为Android构建它的链接)。

由于我是在Windows机器上工作,所以只能告诉您如何从Windows命令行调用它,但对于其他平台,语法类似。该应用程序还具有广泛的API选择,可用于不同的语言(Java、C或C++可能特别适合您),因此您可以将ImageMagick嵌入您的应用程序中,而不是从命令行调用它。

现在就问题本身而言:您需要执行的操作是将带有符号的“覆盖层”放在地图上,就像您用透明的绘图电影胶片放在真实地图上一样。

因此,让我们称map.pngoverlay.png这两个要合并的文件。请注意,叠加文件也是PNG文件(稍后详细介绍)。然后,您可以使用以下命令行调用获得接近所需的结果:

composite.exe -compose atop overlay.png map.png output.jpg

为什么叠加层也必须是PNG图像?因为我们需要一个“叠加表”,在大多数区域中是透明的(除了气球提示和其他绘图所在的区域),但JPG图像不存储透明度信息(它们没有存储此信息的alpha通道)。
因此,您应该修改生成叠加层的代码部分,以生成具有适当alpha通道的PNG图像。
希望这一切都有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接