3

我的应用程序中有一个可重复的模式。

这是应用程序中显示的图像:

原始图像

这是转换为 PDF 后显示的相同图像:

PDF 图像 - 粉红色条而不是褪色的蓝色/灰色

如您所见,图像颜色从灰色/绿色变为粉红色。
PDF 直接加载到准备发送的电子邮件中。

我不确定这是否与加载到 PDF 中的图像本身有关,或者与 PDF 处理过程有关。无论哪种方式,我都在下面附上了 PDF 流程的代码。

这是我的 PDF 生成代码:

- (NSData *)createPDFForView:(UIView *)view{        
    NSMutableData *pdfData = [NSMutableData data];
    UIGraphicsBeginPDFContextToData(pdfData, CGRectMake(0, 0, 792, 600), nil);
    UIGraphicsBeginPDFPage();
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();
    [view setFrame:CGRectMake(0, 0, 792, 600)];
    [view.layer renderInContext:pdfContext];
    UIGraphicsEndPDFContext();
    return pdfData;
}

在PDF过程中,我通过调整框架将其转换为50%的大小,图像本身没有被修改,只是包含图像的视图;图像在框架内自动调整大小。

有什么办法可以阻止这种颜色变化的发生吗?

4

4 回答 4

2

PDF 规范仅支持 JPEG、JPEG2000、TIFF 和 JBIG2(以及其他一些没人关心的无用的)。长话短说,无论您使用什么程序将文档转换为 PDF,都将被迫将图像转换为兼容格式,在这些情况下,传统上选择 JPEG。

所以原因是因为图像被修改为没有透明度的JPEG,并且使用了不尊重保留图像外观的PNG到JPEG转换器。如果图像有任何颜色配置文件,这些配置文件也可能会被剥离。

如果在将文档转换为 PDF 之前将图像转换为 JPEG,您将获得更好的结果并更好地控制发生的事情。这样,该程序将保持您的图像原样,因此您确切地知道您会得到什么。这也是您指定图像颜色配置文件的唯一机会。

如果您可以管理它,JPEG2000 比 JPEG 更可取,特别是如果您正在寻找无损图像。

可以在 PDF 上实现透明度,但这是通过图像对象上的过滤器来实现的,而与使用的图像格式无关。但是,这比您正在做的要先进一些,可能不值得花时间。

于 2013-10-25T07:56:57.620 回答
1

我已经解决了这个错误,但没有弄清楚它的“原因”。

本质上,灰色/蓝色是透明的 PNG。
我给了它一个白色背景并重新保存了图像,它似乎工作正常。

我仍然会将赏金奖励给任何可以帮助我解决“为什么”的人。

于 2013-10-21T09:12:56.480 回答
0

我的猜测是为什么在内部图像被转换为​​JPEG。由于 JPEG 不支持透明度,因此将背景颜色添加到透明像素中。添加的像素通常是灰色或黑色的,但它可能取决于实现或与 PNG 中的“背景颜色”数据字段相关。

潜在的问题可能是 PDF 标准并不真正支持嵌入式 PNG。当它渲染它们时,通常是因为创建者软件将数据转换为未压缩的光栅字节,但这只会使文件膨胀。

它甚至可能比这更复杂,根据这个 adobe 论坛线程,问题实际上出在 Postscript 上,所以如果 UIView 正在执行 postscript->pdf 转换,也会导致这种情况。

于 2013-10-25T06:53:15.027 回答
0

如果没有确切的颜色(而我在这台计算机上没有我的 Photoshop 副本......),这有点难以分辨,但这似乎是两件事之一:

  1. 色彩空间与图像的 Alpha 通道冲突。我不确定这是怎么发生的,因为您正在获取 PDF 渲染的当前上下文,但是如果您的预期 alpha 值被解释为红色值(例如,您的图像是用 RGBA 制作的并且正在被渲染在 ARGB 中 - 并且预期的 alpha 值高于原始灰色中的其他值),这肯定会使灰色/蓝色图像呈粉红色。
  2. 渲染 PNG 时 iOS 用作“透明颜色”的颜色存在问题。我有点怀疑这是问题所在,我找不到任何关于 iOS 特定主题的文档,但我把它作为一个遥远的可能性扔在那里。我会先看看#1。
于 2013-10-25T02:29:20.303 回答