将UIView转换为PDF会更改图像颜色

时间:2013-10-15 09:11:07

标签: objective-c pdf image-processing pdf-generation cgcontext

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

以下是应用中显示的图片:

Original Image

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

PDF Image - Pink bars instead of faded blue/grey

正如您所看到的,图像颜色从灰色/绿色变为粉红色 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 个答案:

答案 0 :(得分:2)

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

所以原因是因为图像被修改为JPEG而没有透明度,并使用PNG到JPEG转换器,不考虑保留图像的外观。如果图像有任何颜色配置文件,那么它们也可能被剥离。

如果在将文档转换为PDF之前将图像转换为JPEG,您将获得更好的结果并更好地控制所发生的事情。通过这种方式,程序可以保持您的图像不变,因此您可以确切地知道您将获得的图像。这也是您指定图像颜色配置文件的唯一机会。

如果你可以管理它,JPEG2000优于JPEG,特别是如果你正在寻找无损图像。

可以在PDF上实现透明度,但无论使用何种图像格式,都可以通过图像对象上的滤镜实现透明度。然而,这比你正在做的更先进,可能不值得花时间。

答案 1 :(得分:1)

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

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

我仍然会奖励任何可以帮助我解决'为什么'的人。

答案 2 :(得分:0)

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

  1. 颜色空间与图像的Alpha通道冲突。我不确定如何发生这种情况,因为您正在抓取PDF渲染的当前上下文,但是如果您的预期alpha值被解释为红色值(例如,您的图像是在RGBA中制作的并且正在渲染在ARGB中 - 并且预期的alpha值高于原始灰色中的其他值),这肯定会使灰色/蓝色图像变成粉红色。
  2. 在渲染PNG时,iOS使用的颜色问题是“透明色”。我有点怀疑这是问题,我找不到任何关于iOS特定主题的文档,但我把它作为一种远程可能性抛弃。我先看看#1。

答案 3 :(得分:0)

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

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

可能比这更复杂,根据this adobe forum thread,问题实际上是Postscript,所以如果UIView正在进行postcript-> pdf转换,那也会引起这种情况。