Sni*_*per 17 android screenshot
有没有办法在活动中获得某个视图的高分辨率屏幕截图.
我想将我的webview的html内容转换为PDF.为此,我尝试拍摄webview内容的屏幕截图,然后使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*mmm 11
更新:有关op原始问题的答案,请参阅编辑3
有两种选择:
使用库将HTML转换为PDF.这是迄今为止最好的选择,因为它(可能)将文本保存为向量.
获取HTML的高分辨率渲染并将其保存为PNG(当然不是PDF!).
对于HTML到PDF,wkhtmltopdf看起来是一个不错的选择,但它依赖于你在Android上无法真正使用的Qt.还有一些其他库,但我怀疑它们是否能很好地完成PDF渲染.
为了得到高清晰度的WebView,你可以尝试创建自己的WebView,并呼吁onMeasure(...)和onLayout(...),并通过适当的参数,这样的观点是非常大的.然后调用onDraw(myOwnCanvas)webview将自己绘制到画布上,可以Bitmap使用它来支持Canvas.setBitmap().
您可以WebView使用类似的东西将状态复制到新的状态
screenshotterWebview.onRestoreInstanceState(mWebView.onSaveInstanceState());
Run Code Online (Sandbox Code Playgroud)
Orrr甚至可以使用相同的WebView,只是暂时将其调整为大,将onDraw()其调整到画布,然后再将其调整大小.但这变得非常hacky!
如果你把它做得太大,你可能会遇到内存问题.
我想到了第三个,正是你想要的选项,但它是一种硬核.您可以创建Canvas写入PDF 的自定义.实际上,它几乎是简单的,因为底层Canvas是Skia,它实际上包含一个PDF后端.不幸的是,你无法在Android上访问它,因此你基本上必须在Android上构建自己的副本(有说明),并复制/覆盖所有Canvas方法指向你的Skia而不是Androids.请注意,有一种诱惑Picture.writeToStream()方法可以序列化Skia数据,但遗憾的是这种格式不是向前或向后兼容的,所以如果您使用它,您的代码可能只适用于几个版本的Android.
如果/我有完整的代码,我会更新.
实际上,你自己的"拦截"是不可能的Canvas.我开始这样做,并经历了序列化所有函数调用的繁琐过程.有些你不能做,因为它们是隐藏的,但那些看起来并不重要.但最后我才进行序列化Path,发现它只是写入的.这对我来说似乎是一个杀手,所以唯一的选择是解释结果Picture.writeToStream().幸运的是,该格式只有两个版本在使用,它们几乎完全相同.
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);
Run Code Online (Sandbox Code Playgroud)
奇迹般有效.我现在已经放弃了使用矢量文本获取PDF屏幕截图.这当然是可能的,但非常困难.相反,我正在努力获得一个高分辨率的PSD,其中每个绘制操作是一个单独的层,这应该更容易.
Woa这有点长,但成功了!我已经生成了一个.xcf(GIMP)和PDF,其中每个图层都是不同的画布绘制操作.它不像我期望的那么精细,但仍然非常有用!
实际上我的代码只输出全尺寸的PNG,我在GIMP中使用"Open as layers ..."和"Autocrop layer"来制作这些文件,但当然如果你愿意,你可以在代码中这样做.我想我会把它变成博客文章.
下载GIMP或Photoshop演示文件(以3倍分辨率渲染).
| 归档时间: |
|
| 查看次数: |
6978 次 |
| 最近记录: |