Какой размер должен иметь CGPDFContext?

Мне нужно написать 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.


person Duck    schedule 25.01.2015    source источник


Ответы (3)


Если ваше изображение имеет размер 2100 * 3000 пикселей и вы нарисовали его на странице PDF размером 7 * 10 дюймов (504 * 720 точек), ваше изображение будет встроено с разрешением 300 точек на дюйм.
Размер изображения будет сохранен на уровне 2100*3000 пикселей и не будет уменьшен до 504*720 пикселей.

person Mihai Iancu    schedule 25.01.2015
comment
ах, это то, что я пытался подтвердить. СПАСИБО! - person Duck; 26.01.2015

Оба других ответа технически правильны, но позвольте мне попытаться четко ответить на оба ваших вопроса:

Теперь мне нужно создать CGPDFContext. Я где-то читал, что этот контекст должен быть создан в точках, и есть упоминание, что в CGPDFContext одна точка = 1/72 дюйма, что означает, что контекст будет иметь 72 dpi (?).

Параметр, который вы должны передать, — это местоположение и размер медиабокса PDF-файла, который вы хотите создать. Медиабокс — это холст, на который вы можете положить материал.

PDF использует пространство, где 1 пункт равен 1/72 дюйма, но вы не должны думать об этом как о dpi в традиционном «изображении». Это просто соглашение, чтобы вы знали, что указание медиабокса размером 72 x 72 точек даст вам PDF-файл высотой и шириной 1 дюйм в реальном мире.

Итак, какого размера я должен создать этот контекст, чтобы иметь максимальное качество при 300 dpi.

Ваш код правильный :-)

Изображение, которое вы размещаете в этом контексте, всегда будет вставлено в полном размере (это означает, что Apple не будет выбрасывать пиксели за вашу спину). Это означает, что окончательное разрешение вашего изображения определяется количеством пикселей вашего изображения и размером прямоугольника (опять же в пунктах), где вы решили разместить его на странице.

Итак, вы в порядке в этом простом примере. Однако (с риском навредить своему мозгу) имейте в виду, что контексты PDF, как и любые другие контексты, позволяют вам их преобразовывать. Вы можете вращать или сдвигать текущую матрицу преобразования вашего контекста PDF. В этом случае ваше изображение по-прежнему будет иметь все пиксели, но его эффективное разрешение будет зависеть от того, какое зло вы сделали с матрицей преобразования.

person David van Driessche    schedule 25.01.2015
comment
СПАСИБО, объяснение было потрясающим! - person Duck; 26.01.2015

Разрешение не зависит от размера носителя в формате PDF. Размер носителя указывается в 1/72 дюйма, поэтому 2100x3000 «единиц» (то есть точек) соответствует размеру носителя 29,166x41,666 дюйма. Файлы PDF не имеют разрешение.

Как правило, содержимое PDF-файла представляет собой векторную информацию и поэтому не зависит от разрешения. Растровые изображения могут быть нарисованы в формате PDF, и они имеют разрешение, но не 72 dpi. Разрешение изображения зависит от количества образцов изображения в каждом измерении и коэффициента масштабирования, который применяется для его размещения на носителе.

Рассмотрим изображение размером 300x300 образцов. Если мы поместим это в PDF-файл размером 72x72 (т. е. 1 квадратный дюйм) и масштабируем его, чтобы точно соответствовать, то внутреннее изображение будет фактически иметь разрешение 300 dpi.

В терминах PDF я могу взять то же изображение, создать страницу PDF размером 144x144 (2x2 дюйма) и масштабировать изображение, чтобы оно соответствовало этому. Теперь изображение 150 dpi. Изображение не изменилось, но масштабный коэффициент изменился.

Теперь окончательное «разрешение» любых изображений в вашем PDF-файле при рендеринге будет зависеть от количества образцов и коэффициента масштабирования (как указано выше) и разрешения, с которым вы визуализируете PDF-файл. Принимая во внимание 2 приведенных выше случая, если я визуализирую с разрешением 300 dpi, изображение вообще не изменится, но в первом случае исходные образцы изображения будут сопоставлены 1: 1 с конечными выходными пикселями. Однако второе изображение будет отображать каждый образец изображения в 4 пикселя на выходе (поскольку оно было масштабировано на 2 в каждом направлении).

Если вы визуализируете свой PDF-файл (2100x3100 точек) в Photoshop с разрешением 300 dpi, Photoshop создаст растровое изображение размером 8750x12500 пикселей. Он по-прежнему будет 29,16x41,66 дюйма с разрешением 300 точек на дюйм. Если рендерить с разрешением 600 dpi, то получится 17500x25000 пикселей и так далее.

Похоже, что контекст создается в пространстве PDF по умолчанию 1/72 дюйма, поэтому вам просто нужно использовать размер носителя из файла PDF, то есть 2100x3100.

person KenS    schedule 25.01.2015
comment
Чувак, ты портишь мне мозг... Образцы изображений? Что ты имеешь в виду? Итак, мой код правильный? Я имею в виду, если я запишу изображение размером 2100x3000 пикселей в поле размером 504x720 пикселей в контексте 1/72 дюйма, изображение будет сохранено со всеми исходными пикселями? Я предполагаю, что, как говорит PDF, здесь, в этом поле 504x720pt, будет отображаться это изображение, хранящееся здесь, и если изображение имеет больше пикселей, оно будет отображаться четким, если я буду печатать большие размеры. Это правильно? - person Duck; 25.01.2015
comment
У вас нет изображения 2100x3100, если ваш PDF-файл не изготовлен таким образом (может быть, но, вероятно, нет). Файлы PDF обычно не состоят из растровых изображений. Я использую «образцы» для растрового изображения, чтобы отличить его от визуализированного изображения файла PDF. Вы не можете говорить о «пикселях» в файле PDF, потому что в файле PDF нет имеет никаких пикселей (обычно я не могу быть уверен в вашем PDF-файле, поскольку вы не дал ссылку на него). Ваш код правильный? Это зависит от того, что вы хотите, но из вашего описания нет, это должно быть 2100x3100, а не 504x720. - person KenS; 25.01.2015