CGPDFContext 必须有多大?
What size a CGPDFContext has to have?
我必须写一个 CGPDFContext。此 PDF 仅包含一张图片。
图片有 2100 x 3000 像素。
假设我在 Photoshop 中打开此图像并以 300 dpi 打印它。 Photoshop 将使用 300 像素构建打印的每一英寸 material,因此此图像将有 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
PDF 中的分辨率与媒体大小无关。介质尺寸以 1/72 英寸为单位给出,因此 2100x3000 'units'(又称点)是 29.166x41.666 英寸的介质尺寸。 PDF 文件没有分辨率。
一般来说,PDF 的内容是矢量信息,因此与分辨率无关。可以在 PDF 中绘制位图,那些 do 具有分辨率,但不是 72 dpi。图像的分辨率取决于每个维度中图像样本的数量,以及用于将其放在介质上的比例因子。
考虑一张 300x300 图像样本的图像。如果我们将其放置在 72x72(即 1 平方英寸)的 PDF 上,并将其缩放以完全适合,那么图像内部实际上是 300 dpi。
在 PDF 术语中,我可以拍摄相同的图像,制作一个 144x144(2x2 英寸)的 PDF 页面,然后缩放图像以适应它。现在图像是 150 dpi。图像没变,比例变了。
现在,您的 PDF 文件中任何图像的最终 'resolution' 在渲染时将取决于采样数和比例因子(如上所述)以及您渲染 PDF 文件的分辨率。以上面的两种情况为例,如果我以 300 dpi 渲染,图像根本不会改变,但在第一种情况下会将 1:1 原始图像样本映射到最终输出像素上。然而,第二张图像会将每个图像样本映射到输出中的 4 个像素(因为它在每个方向上都按 2 缩放)。
如果您在 Photoshop 中渲染 PDF 文件(2100x3100 点)@300 dpi,那么 Photoshop 将创建一个 8750x12500 像素的位图。它仍然是 29.16x41.66 英寸,每英寸 300 点。如果您以 600 dpi 渲染它,那么您将获得 17500x25000 像素,依此类推。
听起来上下文是在 1/72 英寸的默认 PDF space 中创建的,因此您只需要使用 PDF 文件中的媒体大小,即 2100x3100。
如果您的图像是 2100*3000 像素并且您将其绘制在 7*10 英寸(504*720 点)的 PDF 页面上,那么您的图像将以 300 dpi 嵌入。
图像大小将保持在2100*3000像素,不会缩小到504*720像素。
其他两个答案在技术上都是正确的,但让我试着明确回答你的两个问题:
Now I have to create a CGPDFContext. I read somewhere that this
context has to be created in points and there is a mention that on a
CGPDFContext one point = 1/72 inches, meaning that the context will
have 72 dpi (?).
您必须传递的参数是要创建的 PDF 的媒体框的位置和大小。媒体盒是 canvas 您可以随意放东西的地方。
PDF 使用 space,其中 1 点等于 1/72 英寸,但您不应将其视为传统 "image" 方式中的 dpi。这只是一个约定,以便您知道指定大小为 72 x 72 点的媒体框将在现实世界中为您提供 1 英寸高和宽的 PDF 文件。
So, what size should I create this context to have maximum quality at
300 dpi.
您的代码是正确的:-)
您在此上下文中放置的图像将始终以完整尺寸插入(这意味着,Apple 不会在您背后丢掉像素)。这意味着图像的最终分辨率取决于图像的像素数和您选择将其放置在页面上的矩形的大小(同样以磅为单位)。
所以你在这个简单的例子中没有问题。但是(冒着伤脑筋的风险)请记住,PDF 上下文——就像任何其他上下文一样——允许您转换它们。您可以旋转或剪切 PDF 上下文的当前变换矩阵。在那种情况下,您的图像仍将具有所有像素,但它的有效分辨率将取决于您对变换矩阵做了什么坏事。
我必须写一个 CGPDFContext。此 PDF 仅包含一张图片。
图片有 2100 x 3000 像素。
假设我在 Photoshop 中打开此图像并以 300 dpi 打印它。 Photoshop 将使用 300 像素构建打印的每一英寸 material,因此此图像将有 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
PDF 中的分辨率与媒体大小无关。介质尺寸以 1/72 英寸为单位给出,因此 2100x3000 'units'(又称点)是 29.166x41.666 英寸的介质尺寸。 PDF 文件没有分辨率。
一般来说,PDF 的内容是矢量信息,因此与分辨率无关。可以在 PDF 中绘制位图,那些 do 具有分辨率,但不是 72 dpi。图像的分辨率取决于每个维度中图像样本的数量,以及用于将其放在介质上的比例因子。
考虑一张 300x300 图像样本的图像。如果我们将其放置在 72x72(即 1 平方英寸)的 PDF 上,并将其缩放以完全适合,那么图像内部实际上是 300 dpi。
在 PDF 术语中,我可以拍摄相同的图像,制作一个 144x144(2x2 英寸)的 PDF 页面,然后缩放图像以适应它。现在图像是 150 dpi。图像没变,比例变了。
现在,您的 PDF 文件中任何图像的最终 'resolution' 在渲染时将取决于采样数和比例因子(如上所述)以及您渲染 PDF 文件的分辨率。以上面的两种情况为例,如果我以 300 dpi 渲染,图像根本不会改变,但在第一种情况下会将 1:1 原始图像样本映射到最终输出像素上。然而,第二张图像会将每个图像样本映射到输出中的 4 个像素(因为它在每个方向上都按 2 缩放)。
如果您在 Photoshop 中渲染 PDF 文件(2100x3100 点)@300 dpi,那么 Photoshop 将创建一个 8750x12500 像素的位图。它仍然是 29.16x41.66 英寸,每英寸 300 点。如果您以 600 dpi 渲染它,那么您将获得 17500x25000 像素,依此类推。
听起来上下文是在 1/72 英寸的默认 PDF space 中创建的,因此您只需要使用 PDF 文件中的媒体大小,即 2100x3100。
如果您的图像是 2100*3000 像素并且您将其绘制在 7*10 英寸(504*720 点)的 PDF 页面上,那么您的图像将以 300 dpi 嵌入。
图像大小将保持在2100*3000像素,不会缩小到504*720像素。
其他两个答案在技术上都是正确的,但让我试着明确回答你的两个问题:
Now I have to create a CGPDFContext. I read somewhere that this context has to be created in points and there is a mention that on a CGPDFContext one point = 1/72 inches, meaning that the context will have 72 dpi (?).
您必须传递的参数是要创建的 PDF 的媒体框的位置和大小。媒体盒是 canvas 您可以随意放东西的地方。
PDF 使用 space,其中 1 点等于 1/72 英寸,但您不应将其视为传统 "image" 方式中的 dpi。这只是一个约定,以便您知道指定大小为 72 x 72 点的媒体框将在现实世界中为您提供 1 英寸高和宽的 PDF 文件。
So, what size should I create this context to have maximum quality at 300 dpi.
您的代码是正确的:-)
您在此上下文中放置的图像将始终以完整尺寸插入(这意味着,Apple 不会在您背后丢掉像素)。这意味着图像的最终分辨率取决于图像的像素数和您选择将其放置在页面上的矩形的大小(同样以磅为单位)。
所以你在这个简单的例子中没有问题。但是(冒着伤脑筋的风险)请记住,PDF 上下文——就像任何其他上下文一样——允许您转换它们。您可以旋转或剪切 PDF 上下文的当前变换矩阵。在那种情况下,您的图像仍将具有所有像素,但它的有效分辨率将取决于您对变换矩阵做了什么坏事。