矩阵#

矩阵是一个由MuPDF中的图像转换使用的行优先3x3矩阵(遵循Adobe PDF参考文献中规定的相关概念)。通过矩阵,您可以以多种方式操作页面的渲染图像:(页面的部分)可以通过设置六个浮点值中的一些或全部进行旋转、缩放、翻转、剪切和移动。

由于所有的点或像素都存在于二维空间中,该矩阵的一列向量是一个常数单位向量,只有其余的六个元素用于操作。这六个元素通常表示为 [a, b, c, d, e, f]。以下是它们在矩阵中的位置:

_images/img-matrix.png

请注意:

  • 下面的方法只是方便函数 - 它们所做的一切,也可以通过直接操作六个数值来实现

  • 所有操作都可以组合在一起 - 您可以构造一个同时旋转剪切缩放移动等的矩阵,一次性完成。如果您选择这样做,请查看下面的备注Adobe PDF 参考资料

方法 / 属性

描述

Matrix.prerotate()

执行旋转

Matrix.prescale()

执行缩放

Matrix.preshear()

执行剪切(倾斜)

Matrix.pretranslate()

执行平移(移动)

Matrix.concat()

执行矩阵乘法

Matrix.invert()

计算反转矩阵

Matrix.norm()

欧几里得范数

Matrix.a

X方向的缩放因子

Matrix.b

剪切效果 Y 方向

Matrix.c

X方向的剪切效果

Matrix.d

缩放因子 Y 方向

Matrix.e

水平偏移

Matrix.f

垂直位移

Matrix.is_rectilinear

如果矩形角落将保持矩形角落,则为真

类 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 进行缩放。仅对属性 ad 产生影响:[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)#

修改矩阵以执行切变,即将矩形转换为平行四边形(菱形)。仅对属性 ad 产生影响: [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 轴的移动 / 平移操作。仅对属性 ef 产生影响:[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 并将结果存储在当前矩阵中。m1m2 可能是当前矩阵。请注意,矩阵乘法不是交换的。因此 m1m2 的顺序是重要的。

Parameters:
  • 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 序列作为参数

  • 矩阵可以像普通数字一样与算术运算符一起使用:它们可以被加、减、乘或除 – 请参阅第几何对象的运算符代数章。

  • 矩阵乘法是 不满足交换律 的 – 改变乘数的顺序通常会改变结果。因此,变换会产生什么结果很快会变得不清楚。

示例#

这里是展示一些可实现效果的示例。所有图片都显示了一些文本,这些文本在某个矩阵的控制下插入,并相对于一个固定的参考点(红点)。

  1. 单位矩阵不执行任何操作。

_images/img-matrix-0.png
  1. 缩放矩阵 Matrix(2, 0.5) 在水平方向上按2的比例拉伸,在垂直方向上按0.5的比例缩小。

_images/img-matrix-1.png
  1. 属性 Matrix.eMatrix.f 分别向右移动和向下移动。在接下来的 10 向右和 20 向下。

_images/img-matrix-2.png
  1. 负的 Matrix.a 会导致左右翻转。

_images/img-matrix-3.png
  1. 负的 Matrix.d 会导致上下翻转。

_images/img-matrix-4.png
  1. 属性 Matrix.b 沿着 x 轴向上 / 向下倾斜。

_images/img-matrix-5.png
  1. 属性 Matrix.c 沿 y 轴左倾 / 右倾。

_images/img-matrix-6.png
  1. 矩阵 Matrix(beta) 对正角度 beta 进行逆时针旋转。

_images/img-matrix-7.png
  1. 展示矩形的一些效果:

    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")
    
_images/img-matrix-9.png

本软件按原样提供,不作任何明示或暗示的担保。该软件根据许可证分发,除非按照该许可证的条款明确授权,否则不得复制、修改或分发。有关许可信息,请参阅artifex.com或联系Artifex Software Inc.,地址:39 Mesa Street, Suite 108A, San Francisco CA 94129, United States以获取更多信息。