Преобразование UIView в PDF изменяет цвет изображения
У меня есть повторяемый шаблон в моем приложении.
Вот изображение, отображаемое в приложении:
Вот то же изображение, которое отображается после преобразования в PDF:
Как вы можете видеть по этому, цвет изображения меняется с серого / зеленого на розовый.
PDF загружается прямо в электронное письмо, готовое к отправке.
Я не уверен, что это связано с тем, что само изображение загружается в PDF или что-то связано с процессом PDFing. В любом случае, я прикрепил код процесса 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 ответа
Спецификация PDF поддерживает только JPEG, JPEG2000, TIFF и JBIG2 (и некоторые другие бесполезные, которые никого не интересуют.) Короче говоря, любая программа, которую вы используете для преобразования вашего документа в PDF, будет вынуждена конвертировать изображение в совместимый формат, и JPEG традиционно выбирается в этих случаях.
Так что причина в том, что изображение было изменено на JPEG без прозрачности и с использованием конвертера PNG в JPEG, которое не учитывало сохранение внешнего вида вашего изображения. Если изображение имело какие-либо цветовые профили, они, вероятно, также были бы удалены.
У вас будут значительно лучшие результаты и больший контроль над тем, что происходит, если вы преобразуете свои изображения в JPEG перед преобразованием документа в PDF. Таким образом, программа сохранит ваши изображения такими, какие они есть, чтобы вы точно знали, что получите. Это также ваш единственный шанс указать цветовой профиль изображения.
Если вы можете управлять этим, JPEG2000 предпочтительнее JPEG, особенно если вы ищете изображения без потерь.
Прозрачность может быть достигнута в PDF, но это достигается с помощью фильтров по объекту изображения, независимо от используемого формата изображения. Однако это немного сложнее, чем то, что вы делаете, и, вероятно, не стоит времени.
Я решил ошибку, но не понял, почему.
По сути, серый / синий цвет был прозрачным PNG.
Я дал этому белый фон и повторно сохранил изображение, и это, кажется, работает хорошо.
Я все еще буду награждать награду любому, кто может помочь мне с "почему".
Немного трудно сказать, не имея точных цветов (и меня без моей копии Photoshop на этом компьютере...), но это похоже на одну из двух вещей:
- Цветовое пространство конфликтует с альфа-каналом вашего изображения. Я не совсем уверен, как это могло произойти, так как вы захватываете текущий контекст для рендеринга PDF, но если ваше предполагаемое альфа-значение интерпретируется как красное значение (например, ваше изображение было сделано в RGBA и отображается в ARGB - и это подразумевало альфа-значение выше, чем другие значения в вашем исходном сером цвете), что определенно могло бы сделать серо-синее изображение розоватым.
- Проблема с цветом iOS использует в качестве "прозрачного цвета" при рендеринге PNG. Я в некотором роде сомневаюсь, что это проблема, и я не смог найти какую-либо документацию по предмету, специфичному для iOS, но я выкидываю ее как удаленную возможность. Я бы посмотрел в первую очередь.
Я думаю, ПОЧЕМУ это то, что внутренне изображение преобразуется в JPEG. Поскольку JPEG не поддерживает прозрачность, цвет фона добавляется к прозрачным пикселям. Добавленные пиксели обычно бывают серыми или черными, но они могут зависеть от реализации или иметь отношение к полю данных "цвет фона" в PNG.
Основная проблема, вероятно, заключается в том, что стандарт PDF на самом деле не поддерживает встроенный PNG. Когда они действительно отрисовывают их, это обычно происходит потому, что программа-создатель преобразовывает данные в несжатые растровые байты, но это просто раздувает файл.
Это может быть более сложным, чем это, даже, согласно этой ветке форума Adobe, проблема на самом деле с Postscript, поэтому, если UIView делает преобразование postscript->pdf, которое также будет причиной этого.