9

我正在使用此 答案的代码截取Google Map v2的屏幕截图,该代码给了我输出:

在此处输入图像描述

哪个可以截取地图的屏幕截图

使用以下代码,我可以使用黑色地图屏幕拍摄布局的屏幕截图,这没关系,因为使用以下代码地图将在 ScreenShot 中变黑

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

上述代码的输出:

在此处输入图像描述

我真正需要的是:

在此处输入图像描述

所以,现在我的问题是如何获得第三屏中的输出programmatically

帮助我通过合并(1 和 2)屏幕来拍摄一张屏幕截图programmatically

programmatically或在拍摄(1和2)屏幕截图后合并两个图像的任何其他替代方法?

4

2 回答 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 ServicesAPI。

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);如果您只想要地图的屏幕截图,请跳过这些行并使用。

于 2013-08-22T05:54:35.730 回答
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 图像。

希望这一切都有帮助。

于 2013-08-21T23:37:54.047 回答