CGPDFContext的大小必须是多少?

时间:2015-01-25 10:19:15

标签: ios cocoa pdf cgimage cgpdfcontext

我必须写一个CGPDFContext。此PDF仅包含一张图片。

图像有2100 x 3000像素。

假设我在Photoshop上打开此图像并以300 dpi打印。 Photoshop将使用300像素来构建每英寸的打印材料,因此该图像将具有7 x 10英寸。

因此,此图片具有此尺寸。

现在我必须创建一个CGPDFContext。我在某地读过这个上下文必须用点创建,并且提到在CGPDFContext上一点= 1/72英寸,这意味着上下文将有72 dpi(?)。

那么,我应该创建这个上下文的大小,以达到300 dpi的最高质量。

另一个问题是:假设这个上下文是基于1/72的东西创建的,那么7 x 10英寸将代表504 x 720 pt。如果这是我必须创建上下文的大小,当我使用这个将图像写入上下文时会发生什么?

CGImageRef imageRef = image.CGImage; // this image is 2100x3000 pixels

// mediaBox = 0,0,504,720
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &mediaBox, auxillaryInformation);

CGContextDrawImage(pdfContext, CGRectMake(0.0f, 0.0f, 504, 720), imageRef);

将2100x3000像素图像嵌入上下文而不会丢失像素吗?我不希望图像缩小到504x720

3 个答案:

答案 0 :(得分:3)

如果您的图像是2100 * 3000像素,并且您在7 * 10英寸(504 * 720点)的PDF页面上绘制它,那么您的图像将以300 dpi嵌入。
图像尺寸将保持在2100 * 3000像素,并且不会以504 * 720像素缩小尺寸。

答案 1 :(得分:1)

其他两个答案在技术上都是正确的,但让我试着明确回答你的两个问题:

  

现在我必须创建一个CGPDFContext。我在某处读到了这个   上下文必须以点的形式创建,并且提到了一个   CGPDFContext一点= 1/72英寸,意味着上下文会   有72 dpi(?)。

您必须传递的参数是您要创建的PDF媒体框的位置和大小。媒体盒是您可以随意使用的画布。

PDF使用1点等于1/72英寸的空间,但您不应该将其视为传统“图像”方式的dpi。这只是一个约定,因此您知道指定一个大小为72 x 72点的媒体盒将为您提供一个在现实世界中高1英寸宽的PDF文件。

  

那么,我应该创建这个上下文的大小,以获得最高质量   300 dpi。

您的代码是正确的: - )

您在此上下文中放置的图像将始终以完整尺寸插入(这意味着Apple不会丢弃背后的像素)。这意味着图像的最终分辨率取决于图像的像素数和矩形的大小(再次以点为单位),您可以选择将其放在页面上。

所以你在这个简单的例子中很好。然而(冒着伤害你的大脑的风险),请记住,PDF上下文 - 就像任何其他上下文一样 - 允许你转换它们。您可以旋转或剪切PDF上下文的当前变换矩阵。在这种情况下,你的图像仍然会包含所有像素,但它的有效分辨率取决于你对变换矩阵所做的邪恶事件。

答案 2 :(得分:0)

分辨率与PDF格式的介质尺寸无关。介质尺寸为1/72英寸,因此2100x3000'单位'(aka点)的介质尺寸为29.166x41.666英寸。 PDF文件有解决方案。

通常,PDF的内容是矢量信息,因此与分辨率无关。位图可以用PDF绘制,而那些有分辨率,但不是72 dpi。图像的分辨率取决于每个维度中的图像样本数量,以及应用于将其放在介质上的比例因子。

考虑一张300x300图像样本的图像。如果我们将它放在一个72x72(即1平方英寸)的PDF上,并将其缩放到恰好适合,那么图像在内部实际上是300 dpi。

在PDF术语中,我可以拍摄相同的图像,制作144x144(2x2英寸)的PDF页面,并缩放图像以适应该图像。现在图像是150 dpi。图像没有改变,但比例因子有。

现在,PDF文件中任何图像的最终“分辨率”在渲染时将取决于样本数和比例因子(如上所述)以及渲染PDF文件的分辨率。以上述两种情况,如果我以300 dpi渲染,图像将根本不会改变,但在第一种情况下,将原始图像采样1:1映射到最终输出像素。但是,第二个图像会将每个图像样本映射到输出中的4个像素(因为它在每个方向上按2缩放)。

如果在Photoshop @ 300 dpi中渲染PDF文件(2100x3100点),Photoshop将创建一个8750x12500像素的位图。它仍然是29.16x41.66英寸,每英寸300点。如果以600 dpi渲染,则会得到17500x25000像素,依此类推。

听起来上下文是在1/72英寸的默认PDF空间中创建的,因此您只需要使用PDF文件中的媒体大小,即2100x3100。