矩阵#
矩阵是一个由MuPDF中的图像转换使用的行优先3x3矩阵(遵循Adobe PDF参考文献中规定的相关概念)。通过矩阵,您可以以多种方式操作页面的渲染图像:(页面的部分)可以通过设置六个浮点值中的一些或全部进行旋转、缩放、翻转、剪切和移动。
由于所有的点或像素都存在于二维空间中,该矩阵的一列向量是一个常数单位向量,只有其余的六个元素用于操作。这六个元素通常表示为 [a, b, c, d, e, f]。以下是它们在矩阵中的位置:
请注意:
下面的方法只是方便函数 - 它们所做的一切,也可以通过直接操作六个数值来实现
所有操作都可以组合在一起 - 您可以构造一个同时旋转和剪切和缩放和移动等的矩阵,一次性完成。如果您选择这样做,请查看下面的备注或Adobe PDF 参考资料。
方法 / 属性 |
描述 |
|---|---|
执行旋转 |
|
执行缩放 |
|
执行剪切(倾斜) |
|
执行平移(移动) |
|
执行矩阵乘法 |
|
计算反转矩阵 |
|
欧几里得范数 |
|
X方向的缩放因子 |
|
剪切效果 Y 方向 |
|
X方向的剪切效果 |
|
缩放因子 Y 方向 |
|
水平偏移 |
|
垂直位移 |
|
如果矩形角落将保持矩形角落,则为真 |
类 API
- class Matrix#
- __init__(self)#
- __init__(self, zoom-x, zoom-y)#
- __init__(self, shear-x, shear-y, 1)#
- __init__(self, a, b, c, d, e, f)#
- __init__(self, matrix)#
- __init__(self, degree)#
- __init__(self, sequence)#
重载构造函数。
没有参数时,将创建零矩阵 Matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)。
zoom-* 和 shear-* 指定缩放或剪切值(浮点数),并分别创建缩放或剪切矩阵。
对于“matrix”,将会制作另一个矩阵的 新副本。
浮动值“degree”指定创建一个逆时针旋转的旋转矩阵。
“序列”必须是具有恰好 6 个浮点条目的任何 Python 序列对象(参见 在 PyMuPDF 中使用 Python 序列作为参数)。
pymupdf.Matrix(1, 1) 和 pymupdf.Matrix(pymupdf.Identity) 创建可修改的 Identity 矩阵的版本,形式为 [1, 0, 0, 1, 0, 0]。
- norm()#
版本 1.16.0 中的新功能
返回矩阵的欧几里得范数作为向量。
- prerotate(deg)#
修改矩阵以进行逆时针旋转正deg度,否则顺时针旋转。单位矩阵的矩阵元素将以以下方式改变:
[1, 0, 0, 1, 0, 0] -> [余弦(deg), 正弦(deg), -正弦(deg), 余弦(deg), 0, 0].
- Parameters:
deg (float) – 旋转角度,单位为度(使用基于Pi = 180度的常规表示法)。
- prescale(sx, sy)#
修改矩阵以根据缩放因子 sx 和 sy 进行缩放。仅对属性 a 到 d 产生影响:[a, b, c, d, e, f] -> [a*sx, b*sx, c*sy, d*sy, e, f]。
- Parameters:
sx (float) – X方向的缩放因子。有关效果,请参见属性a的描述。
sy (float) – Y方向的缩放因子。有关效果,请参见属性 d 的描述。
- preshear(sx, sy)#
修改矩阵以执行切变,即将矩形转换为平行四边形(菱形)。仅对属性 a 到 d 产生影响: [a, b, c, d, e, f] -> [c*sy, d*sy, a*sx, b*sx, e, f].
- Parameters:
sx (float) – X方向的剪切效应。见属性 c。
sy (float) – Y方向的剪切效果。请参见属性 b。
- pretranslate(tx, ty)#
修改矩阵以执行沿 x 和 / 或 y 轴的移动 / 平移操作。仅对属性 e 和 f 产生影响:[a, b, c, d, e, f] -> [a, b, c, d, tx*a + ty*c, tx*b + ty*d]。
- Parameters:
tx (float) – X方向的平移效果。参见属性 e。
ty (float) – Y方向的翻译效果。请参见属性 f。
- concat(m1, m2)#
计算矩阵乘积 m1 * m2 并将结果存储在当前矩阵中。m1 或 m2 可能是当前矩阵。请注意,矩阵乘法不是交换的。因此 m1 和 m2 的顺序是重要的。
- invert(m=None)#
计算矩阵 m 的逆并将结果存储在当前矩阵中。如果 m 不可逆(“退化”),则返回 1。在这种情况下,当前矩阵 将不会改变。如果 m 可逆,则返回 0,并将当前矩阵替换为逆矩阵 m。
- Parameters:
m (Matrix) – 要被求逆的矩阵。如果未提供,将使用当前矩阵。
- Return type:
整型
- a#
在X方向上的缩放 (宽度)。例如,值为0.5会将宽度缩小2倍。如果a < 0,还会额外发生左右翻转。
- Type:
浮点数
- b#
造成剪切效果:每个
Point(x, y)将变为Point(x, y - b*x)。因此,水平线将会“倾斜”。- Type:
浮点数
- c#
造成剪切效果:每个
Point(x, y)将变为Point(x - c*y, y)。因此,垂直线将会“倾斜”。- Type:
浮点数
- d#
在Y方向上缩放 (高度)。例如,值为1.5会使高度拉伸50%。如果 d < 0,则会(额外)发生上下翻转。
- Type:
浮点数
- e#
造成水平偏移效果:每个 Point(x, y) 将变为 Point(x + e, y)。正值(负值)e 将向右(向左)偏移。
- Type:
浮点数
- f#
造成垂直位移效果:每个 Point(x, y) 将变为 Point(x, y - f)。正值(负值)f 将向下(向上)移动。
- Type:
浮点数
- is_rectilinear#
直线意味着没有剪切存在,并且任何旋转都是90度的整数倍。 通常,这用于确认变换前的(轴对齐)矩形在变换后仍然是轴对齐的矩形。
- Type:
布尔值
注意
这个类遵循 Python 序列协议,因此组件也可以通过它们的索引访问。同时请参考 在 PyMuPDF 中使用 Python 序列作为参数。
矩阵可以像普通数字一样与算术运算符一起使用:它们可以被加、减、乘或除 – 请参阅第几何对象的运算符代数章。
矩阵乘法是 不满足交换律 的 – 改变乘数的顺序通常会改变结果。因此,变换会产生什么结果很快会变得不清楚。
示例#
这里是展示一些可实现效果的示例。所有图片都显示了一些文本,这些文本在某个矩阵的控制下插入,并相对于一个固定的参考点(红点)。
单位矩阵不执行任何操作。
缩放矩阵
Matrix(2, 0.5)在水平方向上按2的比例拉伸,在垂直方向上按0.5的比例缩小。
负的
Matrix.a会导致左右翻转。
负的
Matrix.d会导致上下翻转。
属性
Matrix.b沿着 x 轴向上 / 向下倾斜。
属性
Matrix.c沿 y 轴左倾 / 右倾。
矩阵
Matrix(beta)对正角度beta进行逆时针旋转。
展示矩形的一些效果:
import pymupdf # just definitions and a temp PDF RED = (1, 0, 0) BLUE = (0, 0, 1) GREEN = (0, 1, 0) doc = pymupdf.open() page = doc.new_page() # rectangle r1 = pymupdf.Rect(100, 100, 200, 200) # scales down by 50% in x- and up by 50% in y-direction mat1 = pymupdf.Matrix(0.5, 1.5) # shifts by 50 in both directions mat2 = pymupdf.Matrix(1, 0, 0, 1, 50, 50) # draw corresponding rectangles page.draw_rect(r1, color=RED) # original page.draw_rect(r1 * mat1, color=GREEN) # scaled page.draw_rect(r1 * mat2, color=BLUE) # shifted doc.ez_save("matrix-effects.pdf")