2016-11-11 444 views
1

很抱歉,如果这个问题对于某个特定的图书馆来说太具体,但是它看起来非常流行,以至于有人可能知道这个答案。对于AddImage API文档不说各有什么论据是:在IText PDF库中的AddImage的重载中有哪些参数?

public PdfXObject addImage(ImageData image, 
         float a, 
         float b, 
         float c, 
         float d, 
         float e, 
         float f) 
Creates Image XObject from image and adds it to canvas (as Image XObject). 
Parameters: 
image - the PdfImageXObject object 
a - an element of the transformation matrix 
b - an element of the transformation matrix 
c - an element of the transformation matrix 
d - an element of the transformation matrix 
e - an element of the transformation matrix 
f - an element of the transformation matrix 

显然两者的x/y COORDS,大概2是高度和宽度,但是从“遗留”的代码我的工作,不清楚哪一个是哪个,我想不出其他两个浮标可能是什么。

回答

2

那些6个值是有三行三列的矩阵的元素:

enter image description here

你可以使用这个矩阵来表示在二维系统改造。 开展这个相乘的结果是:

enter image description here

开展这个相乘的结果是:

x' = a * x + c * y + e 
y' = b * x + d * y + f 

在矩阵的第三列是固定的:你在两个方面的工作,所以你不需要计算新的z坐标。

在高中时学习解析几何时,您可能已经学会了如何将变换应用到对象。在PDF中,我们使用稍微不同的方法:不是转换对象,而是转换坐标系。尽管如此,你可以使用高中的解析几何知识来理解不同的值是关于什么的。例如:

  • ef是你需要的对象的翻译的值,所以如果你想在该位置x = 36; y = 36添加图像,则需要e = 36; f = 36
  • ad是你需要的缩放的情况下,你没有任何旋转值。例如:如果您希望图像的宽度为100个用户单位,高度为50个用户单位,则需要a = 100; b = 0; c = 0; d = 50

所以要通过的左下角有坐标(36, 36)重合50个用户单位加100的图像,你需要:

cb.addImage(img, 100, 0, 0, 50, 36, 36); 

你可以用下面的公式来计算值为a,b,c,d,ef。例如,如果你想翻译(dX, dY),缩放(sX, sY)和旋转ϕ结合:

a = sX * cos(ϕ); 
b = sY * sin(ϕ); 
c = sX * -sin(ϕ); 
d = sY * cos(ϕ); 
e = dX; 
f = dY; 

这些都是事,如果你深入到你高中的书,你可以重新发现。这是简单的数学;我在17岁时在学校学到的东西;-)

+1

我甚至没有想到PDF库会用这些术语来思考,但现在我明白了。不知道为什么这个东西的原始维护者选择了这个特定的过载,然后没有看到适合评论它......但一切都很好,结果很好 – Toadfish

+0

开发人员应该写出更好的文档。这适用于原始维护者以及撰写iText Javadocs的人;-) –

+0

任何愿意靠近PDF的人可能至少会获得一次或两次免费通行证 – Toadfish