0

我必须写一个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

4

3 回答 3

3

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

于 2015-01-25T20:43:56.280 回答
1

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

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

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

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

那么,我应该创建多大的上下文才能在 300 dpi 下获得最高质量。

你的代码是正确的:-)

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

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

于 2015-01-25T23:49:49.673 回答
0

分辨率与 PDF 格式的媒体大小无关。介质尺寸以 1/72 英寸为单位,因此 2100x3000“单位”(又名点)是 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。

于 2015-01-25T11:50:26.250 回答