高分辨率屏幕截图的Android(High resolution screen shot in An

2019-08-02 23:36发布

有没有什么办法让活动有一定看法的高分辨率屏幕截图。

我想我的WebView的HTML内容转换为PDF格式。 对于我试图把视图内容的截屏,然后利用iText它转换为PDF。 所得PDF不是更清晰。

我的代码:

    protected void takeimg() {
    Picture picture = mWebView.capturePicture();
    Bitmap b = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    picture.draw(c);

    // byte[] bt = b.getNinePatchChunk();

    // Bitmap b;
    // View v1 = mWebView.getRootView();
    // v1.setDrawingCacheEnabled(true);
    // b = Bitmap.createBitmap(v1.getDrawingCache());
    // v1.setDrawingCacheEnabled(false);

    FileOutputStream fos = null;
    try {
        File root = new File(Environment.getExternalStorageDirectory(),
                "Sample");

        if (!root.exists()) {
            root.mkdir();
        }
        String sdcardhtmlpath = root.getPath().toString() + "/"
                + "temp_1.png";

        fos = new FileOutputStream(sdcardhtmlpath);
        // fos = openFileOutput("samsp_1.jpg", MODE_WORLD_WRITEABLE);
        if (fos != null) {
            b.compress(Bitmap.CompressFormat.PNG, 100, fos);

            // fos.write(bt);
            fos.close();
        }
    } catch (Exception e) {
        Log.e("takeimg", e.toString());
        e.printStackTrace();

    }
}


protected void pdfimg() {
    Document mydoc = new Document(PageSize.A3);
    try {
        File root = new File(Environment.getExternalStorageDirectory(),
                "Sample");

        if (!root.exists()) {
            root.mkdir();
        }
        String sdcardhtmlpath = root.getPath().toString() + "/";
        mydoc.setMargins(0, 0, 0, 0);
        PdfWriter.getInstance(mydoc, new FileOutputStream(sdcardhtmlpath
                + PDFfilename));
        mydoc.open();
        Image image1 = Image.getInstance(sdcardhtmlpath + "temp_1.jpg");
        image1.scalePercent(95f);

        mydoc.add(image1);
        // mydoc.newPage();

        mydoc.close();
    } catch (Exception e) {
        Log.e("pdi name", e.toString());
    }
}

Answer 1:

更新:请参见编辑3回答运算的原题

有两个选项:

  1. 使用库的HTML转换为PDF。 这是迄今为止最好的选择,因为它(可能)保留文本作为载体。

  2. 获取高分辨率呈现HTML和它保存为PNG(不PDF肯定!)。

对于HTML到PDF, wkhtmltopdf看起来像一个不错的选择,但是它依赖于Qt的,你不能在Android上真正使用。 还有一些其他的图书馆,但我怀疑他们做的PDF渲染得非常好。

为了得到高清晰度的WebView,你可以尝试创建自己WebView和调用onMeasure(...)onLayout(...)并通过适当的参数,这样的观点是非常大的。 然后调用onDraw(myOwnCanvas)和web视图会自行绘制到你的画布,它可以通过备份Bitmap使用Canvas.setBitmap()

您可以将状态可能复制到新WebView使用类似

screenshotterWebview.onRestoreInstanceState(mWebView.onSaveInstanceState());

Orrr它甚至有可能使用相同WebView ,只是暂时调整其大小要大, onDraw()到您的画布上,并再次调整其大小。 这已经非常哈克尽管!

如果你把它太大了,你可能会遇到内存问题。

编辑1

我想到了一个第三,究竟-什么,你想要的选项,但它是一种硬派的。 您可以创建一个自定义的Canvas上,编写到PDF。 事实上,这几乎是容易的,因为潜在的Canvas是Skia的,这实际上包括PDF后端。 不幸的是你没有访问它在Android上,所以你基本上要建立它在Android上自己的副本(有说明),以及复制/重写所有的Canvas的方法来指向您的Skia的,而不是机器人。 请注意,有一个诱人的Picture.writeToStream()其序列化的Skia的数据,但遗憾的是这种格式不向前或向后兼容的,所以如果你使用它的代码可能仅适用于Android的几个版本的工作方法。

我会更新,如果/当我已经完全运行的代码。

编辑2

其实这是不可能让自己的“拦截” Canvas 。 我开始做它,并通过序列化所有的函数调用的繁琐过程去。 一些你不能这样做,因为他们是隐藏的,但那些看起来并不重要。 但就在最后,我来到了序列化Path才发现它是只写的。 这似乎是一个杀手给我,所以唯一的选择就是解释的结果Picture.writeToStream() 幸运的是只有两个版本在使用这种格式,他们几乎是一样的。

编辑3 -非常简单的方法来获得高分辨率的Bitmap的视图

好了,事实证明刚开视图的高分辨率位图(其可以是整个应用程序)是显然的。 这里是如何得到双倍的分辨率。 显然,所有的位图看起来有点废话,但文字是在全分辨率渲染:

View window = activity.getWindow().getDecorView()

Canvas bitmapCanvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(window.getWidth()*2, window.getHeight()*2, Bitmap.Config.ARGB_8888);

bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.scale(2.0f, 2.0f);
window.draw(bitmapCanvas);

bitmap.compress(Bitmap.CompressFormat.PNG, 0, myOutputStream);

奇迹般有效。 现在我已经放弃了掌握矢量文本PDF截图。 这当然是可能的,但非常困难。 相反,我的工作得到一个高清晰度的PSD,每个绘制操作是一个单独的层,这要容易得多。

编辑4

WOA这是有点长,但成功! 我已经产生的.xcf (GIMP)和PDF,其中每个层是不同的画布绘制操作。 它不是很细粒度的,因为我期待,不过,非常有用!

其实我的代码只是输出全尺寸的PNG和我以前在GIMP“作为开放层...”和“自动裁剪层”,以使这些文件,当然你可以做到这一点的代码,如果你喜欢。 我想我会变成一个博客帖子。

下载GIMP或Photoshop的演示文件(在3倍的分辨率呈现)。



Answer 2:

当你捕捉的观点,只是屏幕结合将捕获(由于控制体重和Android渲染管线)。

捕获屏幕截图转换为PDF是取巧的办法。 我认为,双向是比较合理的解决方案。

解决方案#1

写解析器(很简单),以视图内容转换(即HTML)来iText的格式。
您可以参考本文以获取更多信息。
http://www.vogella.com/articles/JavaPDF/article.html

还写了一个解析器,你可以使用正则表达式,并提供自己的方法,如parseTableparseImage ,...

解决方案#2 上网必选

提供一个URL(或Web服务)使用,有很多漂亮的图书馆PHP或C#为HTML转换为PDF。 接下来,您可以发送下载链接到客户端(Android设备)。

所以,你也可以动态地添加一些标签,横幅,...从服务器端的PDF。



Answer 3:

截屏只是画面设备屏幕通常取决于你的手机绝对的像素,如果你的手机是480x800的屏幕快照将是相同的,普遍适用于所有的情况。



Answer 4:

当然,使用此:

Bitmap bitmap;
View v1 = MyView.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

这里MyView的是你需要的截图观。



文章来源: High resolution screen shot in Android