位图#

位图(“像素图”)是MuPDF渲染能力的核心对象。它们表示平面矩形像素集合。每个像素由几个字节(“组件”)描述其颜色,并有一个可选的 alpha 字节定义其透明度。

在PyMuPDF中,有几种方法可以创建一个pixmap。除了第一种,其余的都可以作为重载构造函数使用。可以创建一个pixmap …

  1. 从文档页面 (方法 Page.get_pixmap())

  2. 为空,基于 ColorspaceIRect 信息

  3. 从文件中

  4. 从内存中的图像

  5. 从一块纯像素的内存区域

  6. 从 PDF 文档中的图像

  7. 作为另一个位图的副本

注意

支持多种图像格式作为上面第3和第4点的输入。请参见

支持的输入图像格式

查看常见问题解答部分,了解一些像素映像使用的“实际情况”。

方法 / 属性

简短描述

Pixmap.clear_with()

清除位图的部分

Pixmap.color_count()

确定已使用的颜色

Pixmap.color_topusage()

确定最常用颜色的比例

Pixmap.copy()

复制另一个像素图的部分

Pixmap.gamma_with()

将伽马因子应用于像素图

Pixmap.invert_irect()

翻转给定区域的像素

Pixmap.pdfocr_save()

将位图保存为一页OCR PDF

Pixmap.pdfocr_tobytes()

将位图保存为OCR处理的单页PDF

Pixmap.pil_image()

创建一个Pillow图像

Pixmap.pil_save()

保存为Pillow图像

Pixmap.pil_tobytes()

作为Pillow图像写入bytes

Pixmap.pixel()

返回一个像素的值

Pixmap.save()

以多种格式保存位图

Pixmap.set_alpha()

设置透明度值

Pixmap.set_dpi()

设置图像分辨率

Pixmap.set_origin()

设置pixmap的x,y值

Pixmap.set_pixel()

设置一个像素的颜色和透明度

Pixmap.set_rect()

设置矩形内所有像素的颜色和透明度

Pixmap.shrink()

在保持比例的情况下减小大小

Pixmap.tint_with()

给位图着色

Pixmap.tobytes()

返回一个内存区域,支持多种格式

Pixmap.warp()

返回一个由内部四边形生成的图像

Pixmap.alpha

透明度指示器

Pixmap.colorspace

位图的 Colorspace

Pixmap.digest

pixmap的MD5哈希码

Pixmap.height

位图高度

Pixmap.interpolate

插值方法指示符

Pixmap.is_monochrome

检查是否仅出现黑白

Pixmap.is_unicolor

检查是否仅出现一种颜色

Pixmap.irect

IRect 的位图

Pixmap.n

每个像素的字节数

Pixmap.samples_mv

memoryview 的像素区域

Pixmap.samples_ptr

指向像素区域的Python指针

Pixmap.samples

bytes 像素区域的副本

Pixmap.size

pixmap的总长度

Pixmap.stride

一行图像的大小

Pixmap.width

位图宽度

Pixmap.x

左上角的X坐标

Pixmap.xres

在X方向上的分辨率

Pixmap.y

左上角的Y坐标

Pixmap.yres

Y方向的分辨率

类 API

class Pixmap#
__init__(self, colorspace, irect, alpha=False)#

新建空白位图: 创建一个大小和起点由矩形给定的空白位图。因此,irect.top_left 指定了位图的左上角,其宽度和高度分别为 irect.widthirect.height。请注意,图像区域未初始化,将包含无效数据 – 使用例如 clear_with()set_rect() 来确保。

Parameters:
  • 颜色空间 (颜色空间) – 颜色空间。

  • 直接 (直接类似) – 像素图的位置和尺寸。

  • alpha (bool) – 指定是否应包含透明度字节。 默认值为 False

__init__(self, colorspace, source)#

复制并设置颜色空间: 复制 source 像素图并转换颜色空间。任何颜色空间组合都是可能的,但源颜色空间必须不是 None

Parameters:
  • colorspace (颜色空间) – 所需的 目标 颜色空间。这个 也可以是 。在这种情况下,会创建一个“遮罩”位图:它的 Pixmap.samples 将仅包含源的 alpha 字节。

  • (Pixmap) – 源图形。

__init__(self, source, mask)#
  • v1.18.18中的新内容

复制并添加图像蒙版: 复制 像素图,添加一个具有来自蒙版像素图的透明度数据的 alpha 通道。

Parameters:
  • (位图) – 无透明通道的位图。

  • mask (Pixmap) – 一个掩码位图。必须是灰度位图。

__init__(self, source, width, height[, clip])#

复制和缩放: 复制 位图,缩放新的宽度和高度值 – 图像将相应地显得被拉伸或缩小。支持部分复制。源颜色空间可能是

Parameters:
  • (Pixmap) – 源图形。

  • width (float) – 期望的目标宽度。

  • height (float) – 期望的目标高度。

  • clip (irect_like) – 限制生成的位图到此缩放位图的区域。

注意

如果宽度或高度不表示整数(即value.is_integer() != True),那么生成的位图将具有 alpha 通道

__init__(self, source, alpha=1)#

复制并添加或删除 alpha: 复制 source 并添加或删除其 alpha 通道。如果 alpha 等于 source.alpha,则为相同的复制。如果添加了 alpha 通道,其值将设为 255。

Parameters:
  • (Pixmap) – 源位图。

  • alpha (bool) – 目标是否将具有 alpha 通道,默认为必需,如果源色彩空间为 None

注意

一个典型的用法包括在单独的像素图中分离颜色和透明度字节。一些应用程序需要这样做,例如 wx.Bitmap.FromBufferAndAlpha()wxPython

>>> # 'pix' is an RGBA pixmap
>>> pixcolors = pymupdf.Pixmap(pix, 0)    # extract the RGB part (drop alpha)
>>> pixalpha = pymupdf.Pixmap(None, pix)  # extract the alpha part
>>> bm = wx.Bitmap.FromBufferAndAlpha(pix.width, pix.height, pixcolors.samples, pixalpha.samples)
__init__(self, filename)#

来自文件:文件名 创建一个位图。所有属性均从输入推断。生成的位图的原点是 (0, 0)

Parameters:

filename (str) – 图像文件的路径。

__init__(self, stream)#

来自内存: 从内存区域创建一个位图。所有属性都是从输入中推断出来的。结果位图的原点是 (0, 0)

Parameters:

stream (bytes,bytearray,BytesIO) –

包含完整有效图像的数据。例如可以通过 stream = bytearray(open(‘image.file’, ‘rb’).read()) 创建。类型 bytes 仅在 Python 3 中支持,因为在 Python 2 中 bytes == str,此方法会将流解释为文件名。

在版本 1.14.13 中更改: 现在也支持 io.BytesIO

__init__(self, colorspace, width, height, samples, alpha)#

从普通像素:样本创建一个点阵图。每个像素必须由一定数量的字节表示,这由色彩空间透明度参数控制。生成的点阵图的原点是(0, 0)。当其他程序提供原始图像数据时,此方法非常有用 – 请参见常见问题

Parameters:
  • 颜色空间 (颜色空间) – 图像的颜色空间。

  • width (int) – 图像宽度

  • height (int) – 图像高度

  • 样本 (字节,字节数组,BytesIO) –

    包含图像所有像素的区域。如果指定,必须包含 alpha 值。

    在版本 1.14.13 中更改: (1) io.BytesIO 现在也可以使用。 (2) 数据现在被复制到图像图,因而可以安全删除或变得不可用。

  • alpha (bool) – 是否包含透明度通道。

注意

  1. 以下方程 必须为真: (colorspace.n + alpha) * width * height == len(samples).

  2. 从版本 1.14.13 开始,样本数据被 复制 到图像中。

__init__(self, doc, xref)#

来自PDF图像: 从PDF中包含的图像创建一个像素图 文档,通过其xref进行识别。所有的pimap属性都由图像设置。查看extract-img1.pyextract-img2.py,了解如何使用此方法恢复PDF中的所有图像。

Parameters:
  • 文档 (文档) – 一个打开的 PDF 文档。

  • xref (int) – 一个图像对象的 xref。例如,您可以使用 Document.get_page_images() 创建特定页面上使用的图像列表,这也会显示每个图像的 xref 编号。

clear_with([value[, irect]])#

初始化样本区域。

Parameters:
  • value (int) – 如果指定,0 到 255 的值都是有效的。每个像素的每个颜色字节将被设置为此值,而 alpha 将被设置为 255(不透明),如果存在。如果省略,则所有字节(包括任何 alpha)都清除为 0x00

  • irect (irect_like) – 要清除的区域。省略以清除整个位图。只能在指定value时指定。

tint_with(black, white)#

通过将黑色和/或白色替换为给定的sRGB整数值来为像素图着色。只支持颜色空间 CS_GRAYCS_RGB,其他颜色空间将被忽略并发出警告。

如果颜色空间是 CS_GRAY,那么将取平均值 (红色 + 绿色 + 蓝色)/3。像素图将原地修改。

Parameters:
  • 黑色 (整型) – 用这个值替换黑色。指定 0x000000 不会造成任何改变。

  • 白色 (int) – 用这个值替换白色。指定 0xFFFFFF 不会产生任何变化。

示例:

  • tint_with(0x000000, 0xFFFFFF) 是一个无操作。

  • tint_with(0x00FF00, 0xFFFFFF) 将黑色变为绿色,保留白色不变。

  • tint_with(0xFF0000, 0x0000FF) 将黑色变为红色,将白色变为蓝色。

gamma_with(gamma)#

对位图应用伽玛因子,即使其变亮或变暗。颜色空间为 None 的位图会被忽略,并会发出警告。

Parameters:

gamma (float) – gamma = 1.0 没有任何效果, gamma < 1.0 使图像变亮, gamma > 1.0 使图像变暗。

shrink(n)#

通过将其宽度和高度都除以 2 来缩小位图:n.

Parameters:

n (int) – 确定新的图像(样本)大小。例如,值为2将宽度和高度除以4,从而导致大小为原始图像的1/16。小于1的值会被忽略,并会发出警告。

注意

使用此方法来缩小图像的大小,同时保持其比例。图像会“就地”更改。如果您想保留原始图像并且还有更多细致的选择,请使用上面的相应复制构造函数。

pixel(x, y)#

版本新特性:: 1.14.5: 返回位置 (x, y) (列,行) 的像素值。

Parameters:
  • x (int) – 像素的列号。必须在 range(pix.width) 范围内。

  • y (int) – 像素的行号,必须在 range(pix.height) 范围内。

Return type:

列表

Returns:

一系列颜色值,以及可能的 alpha 值。它的长度和内容取决于 pixmap 的颜色空间和 alpha 的存在。对于 RGBA pixmap,结果例如为 [r, g, b, a]。所有项都是 range(256) 中的整数。

set_pixel(x, y, color)#

在版本 1.14.7 中的新功能: 操作位于 (x, y)(列,行)位置的像素。

Parameters:
  • x (int) – 像素的列号。必须在 range(pix.width) 范围内。

  • y (int) – 像素的行号。必须在 range(pix.height) 之内。

  • color (sequence) – 作为整数序列给定的期望像素值,范围为range(256)。序列的长度必须等于Pixmap.n,该值包括任何阿尔法字节。

set_rect(irect, color)#

版本 1.14.8 新增: 将矩形的像素设置为一个值。

Parameters:
  • irect (irect_like) – 要用值填充的矩形。实际区域是该参数与 Pixmap.irect 的交集。对于空交集(或无效参数),将不会发生任何变化。

  • color (sequence) – 所需值,作为一系列整数给出,范围在 range(256) 之内。序列的长度必须等于 Pixmap.n,其中包括任何 alpha 字节。

Return type:

布尔值

Returns:

如果矩形无效或与 Pixmap.irect 之间有空交集,则返回 False,否则返回 True

注意

  1. 此方法等同于 Pixmap.set_pixel() 对矩形内每个像素执行,但如果涉及许多像素,则显然快得多

  2. 此方法可以类似于 Pixmap.clear_with() 使用,以某种颜色初始化一个 pixmap,像这样: pix.set_rect(pix.irect, (255, 255, 0)) (RGB 示例,将整个 pixmap 着色为黄色)。

set_origin(x, y)#
  • v1.17.7中的新功能

设置位图左上角的 x 和 y 值。

Parameters:
  • x (int) – x 坐标

  • y (int) – y坐标

set_dpi(xres, yres)#
  • v1.16.17 新功能

  • 在v1.18.0中更改:现在保存为PNG图像时,这些值将被存储。

设置x和y方向的分辨率(dpi)。

Parameters:
  • xres (int) – x方向的分辨率。

  • yres (int) – y方向的分辨率。

set_alpha(alphavalues, premultiply=1, opaque=None)#
  • 在 v 1.18.13 中更改

改变 alpha 值。位图必须具有 alpha 通道。

Parameters:
  • alphavalues (字节,字节数组,BytesIO) – 新的透明度值。如果提供,长度必须至少为 宽度 * 高度。如果省略 (None),所有透明度值都设置为 255(无透明度)。 在版本 1.14.13 中更改: io.BytesIO 现在也被接受。

  • premultiply (bool) – 在 v1.18.13 中新增: 是否将颜色组件与 alpha 值进行预乘。

  • 不透明 (列表,元组) – 忽略 alpha 值并将此颜色设置为完全透明。一个长度为 Pixmap.n 的整数序列,范围在 range(256) 之内。默认值为 None。例如,RGB 的典型选择是 opaque=(255, 255, 255) (白色)。

invert_irect([irect])#

反转IRect irect中所有像素的颜色。如果颜色空间为None,将没有效果。

Parameters:

反向 (反向类似) – 要被反转的区域。省略以反转所有内容。

copy(source, irect)#

位图的直接部分复制到此位图的相应区域。两个位图可能具有不同的尺寸,并且可以各自具有CS_GRAYCS_RGB颜色空间,但它们当前必须具有相同的alpha属性[2]。复制机制会自动调整源和目标之间的不一致,如下所示:

如果从 CS_GRAY 复制到 CS_RGB,源灰度值将被放入每个 rgb 组件字节中。如果反过来,(r + g + b) / 3 将被作为目标的灰度值。

irect和目标像素图的矩形之间,首先计算一个“交集”。这考虑了矩形坐标和当前属性值Pixmap.xPixmap.y(您可以通过Pixmap.set_origin()自由修改这些值)。然后,复制该交集的相应数据。如果交集为空,则不会发生任何事情。

Parameters:
  • (位图) – 源位图。

  • irect (irect_like) – 要复制的区域。

注意

示例:假设您有两个位图, pix1pix2,您希望将 pix2 的右下四分之一复制到 pix1,使其从 pix1 的左上角开始。使用以下代码片段:

>>> # safeguard: set top-left of pix1 and pix2 to (0, 0)
>>> pix1.set_origin(0, 0)
>>> pix2.set_origin(0, 0)
>>> # compute top-left coordinates of pix2 region to copy
>>> x1 = int(pix2.width / 2)
>>> y1 = int(pix2.height / 2)
>>> # shift top-left of pix2 such, that the to-be-copied
>>> # area starts at (0, 0):
>>> pix2.set_origin(-x1, -y1)
>>> # now copy ...
>>> pix1.copy(pix2, (0, 0, x1, y1))
_images/img-pixmapcopy.jpg
save(filename, output=None, jpg_quality=95)#
  • 在 v1.22.0 中更改:添加了对 JPEG 图像的直接支持。图像质量可以通过参数“jpg_quality”进行控制。

将图像作为文件保存。根据选择的输出,仅支持某些或所有颜色空间,并可以选择不同的文件扩展名。请参见下表。

Parameters:
  • filename (str,Path,file) – 要保存的文件。可以作为字符串提供,也可以作为 pathlib.Path 或 Python 文件对象提供。在后两种情况下,文件名来自相应的对象。文件名的扩展名决定了图像格式,可以通过输出参数覆盖。

  • 输出 (str) – 所需的图像格式。默认是文件名的扩展名。如果这两个值和文件扩展名都不支持,将引发异常。有关可能的值,请参见 支持的输出图像格式

  • jpg_quality (int) – 所需的图像质量,默认为95。仅适用于JPEG图像,否则被忽略。该参数在质量与文件大小之间进行权衡。值为98接近无损。更高的值不应导致更好的质量。

Raises:

ValueError – 对于不支持的图像格式。

tobytes(output='png', jpg_quality=95)#
  • 版本 1.14.5 中的新内容:将位图作为指定格式的 bytes 内存对象返回 - 类似于 save()

  • 在 v1.22.0 中更改:添加了 直接 JPEG 支持。图像质量可以通过新参数“jpg_quality”进行影响。

Parameters:
  • 输出 (str) – 所需的图像格式。默认值为“png”。有关可能的值,请参见 支持的输出图像格式

  • jpg_quality (int) – 所需的图像质量,默认为 95。仅适用于 JPEG 图像,否则将被忽略。此参数在质量和文件大小之间进行权衡。值为 98 接近无损质量。更高的值不应导致更好的质量。

  • 输出 – 请求的图像格式。默认值为“png”。其他可能的值请参见 支持的输出图像格式

Raises:

ValueError – 不支持的图像格式。

Return type:

字节

pdfocr_save(filename, compress=True, language='eng', tessdata=None)#
  • v1.19.0中的新功能

  • 在版本1.22.5中更改:支持Tesseract的tessdata的新参数。

使用Tesseract执行文本识别并将图像保存为带有OCR文本层的1页PDF。

Parameters:
  • filename (str,fp) – 指定要保存的文件。可以是字符串,也可以是以“wb”模式打开的文件指针(包括 io.BytesIO() 对象)。

  • compress (bool) – 是否压缩生成的PDF,默认是 True

  • 语言 (str) – 图像中出现的语言。必须以Tesseract格式指定。默认是“eng”,表示英语。使用“+”分隔的Tesseract语言代码来表示多种语言,例如“eng+spa”表示英语和西班牙语。

  • tessdata (str) – Tesseract语言支持的文件夹名称。如果省略,则此信息必须作为环境变量 TESSDATA_PREFIX 存在。

注意

将失败 如果未安装Tesseract 或者环境变量“TESSDATA_PREFIX”未设置为tessdata文件夹名称且未作为参数提供。

pdfocr_tobytes(compress=True, language='eng', tessdata=None)#
  • v1.19.0中的新功能

  • 在 v1.22.5 中更改:支持 Tesseract 的 tessdata 新参数。

使用Tesseract进行文本识别,并将图像转换为带有OCR文本层的1页PDF。内部调用 Pixmap.pdfocr_save()

Returns:

一个在内存中的1页PDF文件。可以像doc=pymupdf.open("pdf", pix.pdfocr_tobytes())那样打开,并可以对其page=doc[0]进行文本提取。

注意

另一种可能的用法是将其插入到某个PDF中。以下代码片段读取文件夹中的图像,并将它们作为页面存储在一个包含OCR文本层的新PDF中:

doc = pymupdf.open()
for imgfile in os.listdir(folder):
   pix = pymupdf.Pixmap(imgfile)
   imgpdf = pymupdf.open("pdf", pix.pdfocr_tobytes())
   doc.insert_pdf(imgpdf)
   pix = None
   imgpdf.close()
doc.save("ocr-images.pdf")

pil_image()#

从图像位图创建一个Pillow图像。必须安装PIL / Pillow。

Raises:

导入错误 - 如果未安装Pillow。

Returns:

一个 ˇˇPIL.Imageˇˇ 对象

pil_save(*args, unmultiply=False, **kwargs)#

使用Pillow将位图写入图像文件。对于MuPDF不支持的输出,请使用此方法。示例包括

  • 格式 JPX, J2K, WebP, 等等。

  • 存储EXIF信息。

  • 如果您不提供dpi信息,则与位图存储的值xresyres会自动使用。

一个简单的例子: pix.pil_save("some.webp", optimize=True, dpi=(150, 150)).

Parameters:

unmultiply (bool) – 如果图像的颜色空间是带透明度的RGB,则 alpha 值可能已经与颜色分量 ref/green/blue 相乘(称为“预乘”)。要强制取消预乘,请将此参数设置为 True. 要了解一些背景,例如,可以在这里查找“预乘 alpha”。

有关其他参数的详细信息,请参阅Pillow文档。

从 v1.22.0 开始,PyMuPDF 直接支持 JPEG 输出。我们建议不再使用这种方法进行 JPEG 输出 - 出于性能原因和避免不必要的外部依赖。

Raises:

导入错误 - 如果未安装Pillow。

pil_tobytes(*args, unmultiply=False, **kwargs)#
  • v1.17.3 中的新内容

返回图像作为指定格式的字节对象,使用Pillow。例如 stream = pix.pil_tobytes(format="WEBP", optimize=True, dpi=(150, 150))。另请参见上文。有关其他参数的详细信息,请参阅Pillow文档。

Raises:

导入错误 - 如果未安装Pillow。

Return type:

字节

warp(quad, width, height)#
  • v1.19.3中的新功能

通过“扭曲”四边形返回一个新的位图,使得四边形的角落成为新的位图的角落。目标位图的 IRect 将是 (0, 0, width, height)

Parameters:
  • 四边形 (四边形_类似) – 一个凸四边形,坐标位于 Pixmap.irect 内部(包括边界点)。

  • width (int) – 希望得到的宽度。

  • height (int) – 所需的结果高度。

Returns:

一个新的像素图,其中四个角按顺时针方向映射到像素图的角: quad.ul -> irect.tl, quad.ur -> irect.tr, 等等。

Return type:

位图

_images/img-warp.png

color_count(colors=False, clip=None)#
  • v1.19.2中的新功能

  • 在 v1.19.3 中更改

确定位图的唯一颜色及其数量。

Parameters:
  • 颜色 (布尔值) – (在 v1.19.3 中更改) 如果 True 返回一个颜色像素及其使用计数的字典,否则仅返回唯一颜色的数量。

  • clip (rect_like) – Pixmap.irect 内部的一个矩形。如果提供,只有那些像素会被考虑。这允许直接检查给定图像的子矩形 – 而不是构建子图像。

Return type:

字典或整数

Returns:

可以是颜色的数量,或者是一个包含项目的字典 pixel: count。像素键是一个长度为 Pixmap.nbytes 对象。

注意

要恢复一个像素的 元组,使用 tuple(colors.keys()[i]) 来获取第 i 个项目。

  • 响应时间取决于图像的采样大小,对于非常大的图像,可能超过一秒。

  • 在适用的情况下,具有不同 alpha 值的像素将被视为不同的颜色。

color_topusage(clip=None)#
  • v1.19.3中的新功能

返回使用最频繁的颜色及其相对频率。

Parameters:

clip (rect_like) – 在Pixmap.irect内部的一个矩形。如果提供,则仅考虑这些像素。这允许直接检查给定pixmap的子矩形,而不是构建子pixmap。

Return type:

元组

Returns:

一个元组 (ratio, pixel) 其中 0 < ratio <= 1pixel 是颜色的像素值。使用这个来决定图像是否“几乎”是单色:响应 (0.95, b"x00x00x00") 意味着95%的所有像素是黑色。这里是一个示例 如何使用Pixmaps:检查文本可见性

alpha#

指示图像是否包含透明信息。

Type:

布尔值

digest#

该位图的MD5哈希值(16字节)。这是一个用于唯一标识的技术值。

Type:

字节

colorspace#

位图的色彩空间。如果图像被视为所谓的 图像掩蔽模板掩蔽(目前仅在提取的 PDF 文档图像中发生),则此值可能是 None

Type:

颜色空间

stride#

包含在 Pixmap.samples 中一行图像数据的长度。这主要用于计算目的。以下表达式为真:

  • len(samples) == height * stride

  • width * n == stride

Type:

整型

is_monochrome#
  • v1.19.2中的新功能

对于只有黑白颜色的灰度图像,这里是 True

Type:

布尔值

is_unicolor#
  • v1.19.2中的新功能

如果所有像素都是相同的(任何颜色空间),则为 True。在适用的情况下,具有不同 alpha 值的像素将被视为不同的颜色。

Type:

布尔值

irect#

包含pixmap的 IRect

Type:

IRect

samples#

所有像素的颜色和(如果 Pixmap.alpha 为真)透明度值。它是一个 width * height * n 字节的区域。每 n 个字节定义一个像素。每 n 个字节依次生成一个像素,按扫描线顺序排列。后续的扫描线彼此紧接着,没有填充。例如,对于 RGBA 颜色空间,这意味着 samples 是一个字节序列,如 …, R, G, B, A, …,而四个字节值 R, G, B, A 定义一个像素。

这个区域可以传递给其他图形库,例如PIL(Python图像库),以进行其他处理,例如将位图保存为其他图像格式。

注意

  • 底层数据通常是一个 大的 内存区域,从中为此属性制作一个 bytes 副本……每次访问它时:例如,一个RGB渲染的字母页面的样本大小几乎为1.4 MB。因此,考虑将其分配给一个新变量,或使用 memoryview 版本 Pixmap.samples_mv(在v1.18.17中新增)。

  • 对基础数据的任何更改只有在再次访问该属性后才能获取。这与使用 memoryview 版本不同。

Type:

字节

samples_mv#
  • v1.18.17 新特性

Pixmap.samples,但使用 Python memoryview 格式。它是指向 pixmap 中的内存 - 而不是它的副本。因此,其创建速度与 pixmap 的大小无关,并且对像素的任何更改将立即可用。

bytearray(pix.samples_mv)bytes(pixmap.samples_mv) 是等价的,可以替代 pix.samples 使用。

我们也有 len(pix.samples) == len(pix.samples_mv)

看看这个来自2 MB JPEG的例子:内存视图是一万倍更快

In [3]: %timeit len(pix.samples_mv)
367 ns ± 1.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %timeit len(pix.samples)
3.52 ms ± 57.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

在Pixmap被销毁后,任何对memoryview的使用尝试都会导致ValueError。

Type:

内存视图

samples_ptr#
  • v1.18.17 新特性

Python 指向像素区域。这是一种特殊的整数格式,可以被支持的应用程序(如 PyQt)直接用于访问样本区域,从而极快地构建它们的图像。例如:

img = QtGui.QImage(pix.samples, pix.width, pix.height, format) # (1)
img = QtGui.QImage(pix.samples_ptr, pix.width, pix.height, format) # (2)

以上两者都会导致相同的Qt图像,但(2)可以快上百倍,因为它避免了对像素区域的额外复制。

警告:在Pixmap被销毁后,Python指针将变得无效,尝试使用它可能会导致Python解释器崩溃。

Type:

整型

size#

包含 len(pixmap)。这通常等于 len(pix.samples) 加上一些特定于平台的值,用于定义对象的其他属性。

Type:

整型

width#
w#

区域的宽度(以像素为单位)。

Type:

整型

height#
h#

区域的高度(单位:像素)。

Type:

整型

x#

左上角的X坐标(以像素为单位)。无法直接更改 – 使用 Pixmap.set_origin()

Type:

整型

y#

左上角的Y坐标(以像素为单位)。无法直接更改 – 使用 Pixmap.set_origin()

Type:

整型

n#

每个像素的组件数。这个数字取决于色彩空间和 alpha。如果色彩空间不是 None(模板掩码),则 Pixmap.n - Pixmap.alpha == pixmap.colorspace.n 为真。如果色彩空间是 None,则 n == alpha == 1

Type:

整型

xres#

水平分辨率,以每英寸的点数(dpi)表示。请参阅 resolution。不能直接更改 – 使用 Pixmap.set_dpi()

Type:

整型

yres#

垂直分辨率,以 dpi(每英寸点数)为单位。请另见 resolution。无法直接更改 - 使用 Pixmap.set_dpi()

Type:

整型

interpolate#

一个仅供信息使用的布尔标志,如果图像将使用“线性插值”绘制则设置为 True。如果 False 将使用“最近邻采样”。

Type:

布尔值

支持的输入图像格式#

以下文件类型被支持作为 输入 来构造位图: BMP, JPEG, GIF, TIFF, JXR, JPX, PNG, PAM 以及所有 可移植任意映像 家族 (PBM, PGM, PNM, PPM)。此支持有两个方面:

  1. 直接通过 Pixmap(filename)Pixmap(byterray) 创建一个图片映像。然后该图片映像将具有由图像确定的属性。

  2. 使用 pymupdf.open(…) 打开这些文件。结果将以包含单个页面的文档形式出现。创建此页面的pixmap提供了在此上下文中可用的所有选项:应用矩阵、选择颜色空间和透明度、将pixmap限制在剪切区域等。

SVG 图像 仅通过上述方法 2 支持,而不是直接作为位图。但请记住:结果是一个 位图图像,这在位图中始终是这样的 [1]

支持的输出图像格式#

支持多种图像输出格式。您可以选择将图像直接写入文件(Pixmap.save()),或生成一个字节对象(Pixmap.tobytes())。这两种方法都接受一个字符串来标识所需的格式(下面的格式列)。请注意,图像的像素色彩空间、透明度支持(alpha)和图像格式并不是所有组合都可能。

格式

颜色空间

透明度

扩展名

描述

jpg, jpeg

灰度,rgb,cmyk

.jpg, .jpeg

联合图像专家组

pam

灰色, rgb, cmyk

.pam

可携带任意地图

pbm

灰度, rgb

.pbm

可移植位图

pgm

灰度, rgb

.pgm

可移植灰度图

png

灰度,rgb

.png

可移植网络图形

pnm

灰色, rgb

.pnm

可携带任意地图

每百万分之一

灰色,rgb

没有

.ppm

可移植的像素图

ps

灰度,rgb,cmyk

.ps

Adobe PostScript 图像

psd

灰度, rgb, cmyk

.psd

Adobe Photoshop 文档

注意

  • 并不是所有的图像文件类型在所有操作系统平台上都受到支持(至少是常见的)。例如,PAM和可移植位图格式在Windows上比较少见甚至未知。

  • 特别是关于CMYK颜色空间,您始终可以使用 rgb_pix = pymupdf.Pixmap(pymupdf.csRGB, cmyk_pix) 将CMYK位图转换为RGB位图,然后以所需的格式保存。

  • 可以看出,MuPDF 的图像支持范围在输入和输出方面不同。在这两种方式都支持的图像格式中,PNG 和 JPEG 可能是最受欢迎的。

  • 我们还建议将“ppm”格式作为输入使用到tkinter的 PhotoImage 方法中,例如: tkimg = tkinter.PhotoImage(data=pix.tobytes(“ppm”)) (参见教程)。这是 非常 快 (比PNG快60倍)。

脚注


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