Android PdfDocument.Page - 图像大小的问题

问题描述 投票:8回答:3

在绘制到PdfDocument.Page时,我遇到了图像变大的问题。该应用针对运行Android 4.4.4(API级别19)的设备。

我正在生成pdf文档并添加如下图像:

PdfDocument document = new PdfDocument();

//Create an A4 sized page 595 x 842 in Postscript points.
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create();

PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();

Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.pdf_logo);

Log.i(Consts.LOG_TAG, "pdf canvas density = " + canvas.getDensity());
Log.i(Consts.LOG_TAG, "pdf UOD logo density = " + logo.getDensity());

canvas.drawBitmap(logo, 50, 50, null);

document.finishPage(page);

/*
document is written out to a FileOuputStream().
Details omitted.
*/

文档写得正确,我使用Canvas.drawText()方法呈现的其他文本看起来很好。 但是,在pdf文档中绘制的图像总是太大。

我检查过图像和画布的密度都是一样的。图像(pdf_logo.jpg)是: - 160 dpi - 分辨率为160 x 160的物理像素。 - 所以尺寸为1英寸x 1英寸。

上面代码中的日志也返回以下内容:

04-22 11:55:50.607:I / App(7856):pdf canvas density = 160 04-22 11:55:50.607:I / App(7856):pdf UOD标识密度= 160

这表明图像dpi也与Canvas密度匹配。但是,当图像被绘制到pdf文档上时,图像远大于1英寸x 1英寸。它的尺寸大约是2英寸x 2英寸的两倍。

我怀疑是Android使用了图像的物理分辨率(160 x 160)并将其转换为PdfDocument.Page大小单位,Postscript点为1/72英寸。所以160个Postscript点相当于2.2英寸〜原始图像尺寸的两倍(1 x 1英寸)。

如果我将图像的大小减半,那么我会得到像素化,因为它将有效地将0.5 x 0.5英寸的图像绘制到1 x 1英寸的空间中。

我想知道如何在PdfDocument.Page上绘制图像作为实际大小,而不会出现这些缩放/大小问题。

android image pdf canvas size
3个回答
1
投票

根据要求,我发现的解决方案是将密度设置为高于应有的值。将位图密度设置为DENSITY_XHIGH而不是DENSITY_HIGH可以为我提供相当大的渲染位图。位图更接近生成pdf时的预期大小。


0
投票

[我将你的解决方案复制到答案中。如果您找到了解决方案请创建答案并自己接受]

我已经尝试将位图密度设置为高于我认为应该是的值:logo.setDensity(DisplayMetrics.DENSITY_XHIGH);这就是诀窍。 (我最初将它设置为DENSITY_HIGH,但它仍然略微缩放图像,因此将其更改为DENSITY_XHIGH。)


0
投票

确切的解决方案是将Canvas的密度设置为72(但为什么?)

  • logo.setDensity(dpi);(从pt和位图大小的所需图像尺寸计算dpi)
  • canvas.setDensity(72);
  • canvas.drawBitmap(logo, ....);
© www.soinside.com 2019 - 2024. All rights reserved.