2016-08-09 3 views
0

Борьба с этим в течение нескольких часов и просто не может понять, как работает PDFlib. У меня есть этот образ, что мы скажем, имеет размер 1000 х 300 пикселей:Как точно разместить обрезанное и измененное изображение с помощью PDFlib?

enter image description here

Теперь я хочу, чтобы поместить часть изображения в коробку 20 х 12 мм (на 300 точек на дюйм) , Изменение размера должно быть таким, чтобы при отсутствии обрезки изображение занимало 70 x 21 мм на странице. 3 мм изображения должны быть обрезаны сверху, а 2 мм обрезаны с левой стороны.

enter image description here

примеры и документация слишком слабы для меня, чтобы понять, как именно параметры fit_image() работы. Как это сделать?

Примечание: Я делаю это на PHP, но, я думаю, главная проблема заключается в том, какие параметры PDFlib нужны, что не зависит от языка.

ответ

0

Для решения этой проблемы необходимо выполнить несколько шагов, но, конечно, это легко возможно. Ваш вопрос содержит различные задачи, которые должны быть решены:

  1. масштаб вниз входного изображения в данной области
  2. клипа это уменьшенное изображение
  3. место изображение масштабируется и прикрепляемый к заданной позиции. (Это было не совсем ясно из вашего вопроса, так что вы можете настроить Y параметры х/о fit_image() в зависимости от ваших потребностей

Это один из способов решить эту проблему:.

# Load the image 
$image = $p->load_image("auto", $imagefile, ""); 

# First we retrieve the dimension and the resolution for the loaded image 
$imagewidth = $p->info_image($image, "imagewidth", ""); 
$imageheight = $p->info_image($image, "imageheight", ""); 
$dpix = $p->info_image($image, "resx", ""); 
$dpiy = $p->info_image($image, "resy", ""); 

# Calculate the scale factor, to fit the image to a width/height of 70 x 21 mm. 
# Use a helper function to calculate the mm-values to the PDF points 
$scalex = mm2pt(70)/$imagewidth; 
$scaley = mm2pt(21)/$imageheight; 

# For demonstrating the correct placing, fit the loaded image with a 
# size of 70x21 mm with a light opacity (scaling it to this dimension 
# might distort the image ratio) (final code would not include this) 
$gstate = $p->create_gstate("opacityfill=.4"); 
$optlist = sprintf("gstate=%d scale {%f %f} dpi=72", 
       $gstate, $scalex, $scaley); 
$p->fit_image($image, mm2pt(10), mm2pt(250), $optlist); 

# Use dpi=72 to ignore the internal DPI value and interpret each image 
# pixel without scaling. 
# Now, specify the partial area with a matchbox clipping (remember that 
# those values are the positions within the 70x21, and y goes from bottom to top) 
$optlist = sprintf("scale {%f %f} matchbox={clipping={%f %f %f %f}} dpi=72", 
        $scalex, $scaley, mm2pt(2)/$scalex, mm2pt(6)/$scaley, 
        mm2pt(22)/$scalex, mm2pt(18)/$scaley); 

# Set the reference point, so the origin of the clipped image will be the 
# same as for the original image 
$p->fit_image($image, mm2pt(10)+mm2pt(2), mm2pt(250)+mm2pt(6), $optlist); 

function mm2pt($mm){ 
    return $mm*2.83465; 
} 

поэтому при использовании этого кода и одного из примеров PDFlib изображений, чтобы поместить частично изображение поверх исходного изображения, я получаю следующий вывод: enter image description here

+0

Я не вижу, где вы устанавливаете 3 мм над изображением и ширина/высота 20 и 12 мм? Я думаю, это в значительной степени цифры для отсечения я не понять ... – TheStoryCoder

+0

Теперь это задумано. 3 мм вычитается из 21 мм, а значит 18 в качестве последнего значения отсечения. Ширина 20 мм добавляется слева от изображения, поэтому 22 в качестве третьего значения отсечения. Высота 12 мм - это разница между вторым и последним значением отсечения. – TheStoryCoder

+0

ну, контрольная точка изображения - нижний левый угол. Оттуда вы должны сделать расчет. – Rainer