首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓的PdfRenderer类产生低质量的图像

安卓的PdfRenderer类产生低质量的图像
EN

Stack Overflow用户
提问于 2015-08-28 14:55:31
回答 3查看 10K关注 0票数 25

我使用PdfRenderer上面的api 21在我的应用程序中显示pdf,我注意到页面的质量非常差。我还遵循了google示例来使用PdfRenderer,这就是我如何为页面创建Bitmap

代码语言:javascript
复制
//mCurrentPage is a PdfRenderer.Page and mImageView is an ImageView
Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), 
                    mCurrentPage.getHeight(),
                    Bitmap.Config.ARGB_8888);
mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
mImageView.setImageBitmap(bitmap);

我使用ARGB_8888是因为据我所知,这是显示位图的最佳质量。我做错什么了吗?

编辑

这是PdfRenderer类与经典Pdf阅读器之间的巨大区别:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-01 08:41:47

ARGB_8888`只用于颜色质量,但打印/显示质量与分辨率有关(在屏幕上显示时,每英寸有多少点)。

例如,如果您有400个DPI屏幕(每英寸400个点),并且希望以这种质量显示PDF,那么您应该通过以像素为大小的Bitmap.createBitmap()来呈现位图:

代码语言:javascript
复制
Bitmap bitmap = Bitmap.createBitmap(
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getWidth() / 72,                        
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getHeight() / 72,
    Bitmap.Config.ARGB_8888
);

其中:

  1. getResources().getDisplayMetrics().densityDpi是新闻部的目标决议
  2. mCurrentPage.getWidth()返回Postscript点的宽度,其中每个pt为1/72英寸。
  3. 72 (DPI)是PDF的默认决议。

因此,潜水2乘72英寸,乘以DPI,我们得到像素。换句话说,为了与显示的打印设备的质量相匹配,您应该增加默认PDF分辨率为72 DPI的图像的大小。也请检查this post

票数 58
EN

Stack Overflow用户

发布于 2016-10-02 08:17:53

我有点晚了。标记的答案对我没有帮助,因为位图变大了,因此无法呈现。我找到了原来的帖子,因为我有同样的问题,也许这个答案会帮助我的处境中的其他人。

我四处搜索,看看有没有人在保持比例的同时,有一个很好的解决方案来缩放位图。我偶然发现这个网站:

https://guides.codepath.com/android/Working-with-the-ImageView#scaling-a-bitmap

这不是什么复杂的事情,真的。我只需要另外两行代码:

代码语言:javascript
复制
int height = DeviceDimensionsHelper.getDisplayHeight(this);
Bitmap scaledBitmap = BitmapUtil.scaleToFitHeight(bitmap, height);

我添加了类似于站点建议的助手/util类(因此在实践中,它超过了两行)。高度来自于

代码语言:javascript
复制
context.getResources().getDisplayMetrics().widthPixels;

缩放只需将设备高度与原始位图高度相除,得到一个因子,该因子又与原始位图宽度相乘,以求缩放的宽度。

这在我的Nexus 5上工作得很好。我还无法在多个设备上测试这一点,但它似乎是一个可靠的解决方案。

票数 7
EN

Stack Overflow用户

发布于 2019-06-10 12:22:23

PdfRenderer一样,您将在ImageView中显示PDF页面,最简单的方法是创建一个ImageView最大大小的位图,并添加一些数学以保留PDF的比例。因为PDF通常是为打印而制作的,所以它们的分辨率总是比你的屏幕要高,所以你不会冒着获得像素图像的风险。要确定ImageView分配了measuredWidthmeasuredHeight,请在代码中使用ImageView::post() (请原谅我的Kotlin):

代码语言:javascript
复制
    pdfPageImageView.post {
        val viewWidth = pdfPageImageView.measuredWidth
        val viewHeight = pdfPageImageView.measuredHeight
        val pageWidth = page.width
        val pageHeight = page.height
        val pageRatio = 1.0 * pageWidth / pageHeight
        val viewRatio = 1.0 * viewWidth / viewHeight
        val bitmapWidth: Int
        val bitmapHeight: Int
        if (pageRatio > viewRatio) {
            bitmapWidth = viewWidth
            bitmapHeight = (viewWidth / pageRatio).toInt()
        } else {
            bitmapHeight = viewHeight
            bitmapWidth = (viewHeight * pageRatio).toInt()
        }
        val bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888)
        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
        pdfPageImageView.setImageBitmap(bitmap)
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32273961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档