Pixmap#

Pixmaps(”像素图”)是 MuPDF 渲染功能的核心对象。它们表示一组矩形像素。每个像素由一个字节数(”组件”)来定义其颜色,以及一个可选的 alpha 字节来定义其透明度。

在 PyMuPDF 中,有几种创建 pixmap 的方式。除第一种外,其他方法都可以作为重载构造函数来使用。Pixmap 可以通过以下方式创建:

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

  2. 空的,基于 ColorspaceIRect 信息

  3. 从文件

  4. 从内存图像

  5. 从纯像素的内存区域

  6. 从 PDF 文档中的图像

  7. 作为另一个 pixmap 的副本

备注

上述第 3 和第 4 点支持多种图像格式作为输入。有关更多信息,请参见 支持的输入图片格式 部分。

请查看 FAQ 部分,了解一些 pixmap 使用的示例。

Pixmaps (“pixel maps”) are objects at the heart of MuPDF’s rendering capabilities. They represent plane rectangular sets of pixels. Each pixel is described by a number of bytes (“components”) defining its color, plus an optional alpha byte defining its transparency.

In PyMuPDF, there exist several ways to create a pixmap. Except the first one, all of them are available as overloaded constructors. A pixmap can be created …

  1. from a document page (method Page.get_pixmap())

  2. empty, based on Colorspace and IRect information

  3. from a file

  4. from an in-memory image

  5. from a memory area of plain pixels

  6. from an image inside a PDF document

  7. as a copy of another pixmap

备注

A number of image formats is supported as input for points 3. and 4. above. See section 支持的输入图片格式.

Have a look at the FAQ section to see some pixmap usage “at work”.

Method / Attribute

Short Description

Pixmap.clear_with()

clear parts of the pixmap

Pixmap.color_count()

determine used colors

Pixmap.color_topusage()

determine share of most used color

Pixmap.copy()

copy parts of another pixmap

Pixmap.gamma_with()

apply a gamma factor to the pixmap

Pixmap.invert_irect()

invert the pixels of a given area

Pixmap.pdfocr_save()

save the pixmap as an OCRed 1-page PDF

Pixmap.pdfocr_tobytes()

save the pixmap as an OCRed 1-page PDF

Pixmap.pil_image()

create a Pillow Image

Pixmap.pil_save()

save as a Pillow Image

Pixmap.pil_tobytes()

write to bytes as a Pillow Image

Pixmap.pixel()

return the value of a pixel

Pixmap.save()

save the pixmap in a variety of formats

Pixmap.set_alpha()

set alpha values

Pixmap.set_dpi()

set the image resolution

Pixmap.set_origin()

set pixmap x,y values

Pixmap.set_pixel()

set color and alpha of a pixel

Pixmap.set_rect()

set color and alpha of all pixels in a rectangle

Pixmap.shrink()

reduce size keeping proportions

Pixmap.tint_with()

tint the pixmap

Pixmap.tobytes()

return a memory area in a variety of formats

Pixmap.warp()

return a pixmap made from a quad inside

Pixmap.alpha

transparency indicator

Pixmap.colorspace

pixmap’s Colorspace

Pixmap.digest

MD5 hashcode of the pixmap

Pixmap.height

pixmap height

Pixmap.interpolate

interpolation method indicator

Pixmap.is_monochrome

check if only black and white occur

Pixmap.is_unicolor

check if only one color occurs

Pixmap.irect

IRect of the pixmap

Pixmap.n

bytes per pixel

Pixmap.samples_mv

memoryview of pixel area

Pixmap.samples_ptr

Python pointer to pixel area

Pixmap.samples

bytes copy of pixel area

Pixmap.size

pixmap’s total length

Pixmap.stride

size of one image row

Pixmap.width

pixmap width

Pixmap.x

X-coordinate of top-left corner

Pixmap.xres

resolution in X-direction

Pixmap.y

Y-coordinate of top-left corner

Pixmap.yres

resolution in Y-direction

Class API

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

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

参数:
  • colorspace (Colorspace) – 颜色空间。

  • irect (irect_like) – Pixmap 的位置和尺寸。

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

__init__(self, colorspace, source)#

复制并设置颜色空间: 复制 source Pixmap,并转换其颜色空间。任何颜色空间组合都是可以的,但源颜色空间不能是 None

参数:
  • colorspace (Colorspace) – 目标颜色空间。也可以是 None。在这种情况下,将创建一个“掩膜” Pixmap:其 Pixmap.samples 将仅包含源的 alpha 字节。

  • source (Pixmap) – 源 Pixmap。

__init__(self, source, mask)#
  • 从 v1.18.18 新增

复制并添加图像掩膜: 复制 source Pixmap,添加一个 alpha 通道,使用来自掩膜 Pixmap 的透明度数据。

参数:
  • source (Pixmap) – 没有 alpha 通道的 Pixmap。

  • mask (Pixmap) – 掩膜 Pixmap。必须是灰度 Pixmap。

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

复制并缩放: 复制 source Pixmap,缩放到新的宽度和高度 —— 图像将相应地拉伸或缩小。支持部分复制。源颜色空间可以是 None

参数:
  • source (Pixmap) – 源 Pixmap。

  • width (float) – 目标宽度。

  • height (float) – 目标高度。

  • clip (irect_like) – 限制结果 Pixmap 为此区域的 缩放 版本。

备注

如果宽度或高度不代表整数(即 value.is_integer() != True),则结果 Pixmap 将具有 alpha 通道

__init__(self, source, alpha=1)#

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

参数:
  • source (Pixmap) – 源 Pixmap。

  • alpha (bool) – 目标是否具有 alpha 通道,如果源颜色空间是 None,则默认并且是强制的。

备注

一个典型的用法是将颜色和透明度字节分离到不同的 Pixmap 中。某些应用程序需要这样做,例如 wxPython 中的 wx.Bitmap.FromBufferAndAlpha()

>>> # 'pix' 是 RGBA Pixmap
>>> pixcolors = pymupdf.Pixmap(pix, 0)    # 提取 RGB 部分(去除 alpha)
>>> pixalpha = pymupdf.Pixmap(None, pix)  # 提取 alpha 部分
>>> bm = wx.Bitmap.FromBufferAndAlpha(pix.width, pix.height, pixcolors.samples, pixalpha.samples)
__init__(self, filename)#

来自文件:filename 创建一个 Pixmap。所有属性都从输入中推断出来。生成的 Pixmap 的原点是 (0, 0)

参数:

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

__init__(self, stream)#

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

参数:

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)#

来自原始像素:samples 创建一个 Pixmap。每个像素必须由一定数量的字节表示,具体由 colorspacealpha 参数控制。生成的 Pixmap 的原点是 (0, 0)。此方法适用于当其他程序提供原始图像数据时 —— 参见 FAQ

参数:
  • colorspace (Colorspace) – 图像的颜色空间。

  • width (int) – 图像宽度

  • height (int) – 图像高度

  • samples (bytes, bytearray, BytesIO) –

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

    版本 1.14.13 更改: (1) 现在也可以使用 io.BytesIO。 (2) 数据现在 被复制 到 Pixmap,因此可以安全地删除或使其不可用。

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

备注

  1. 必须满足以下公式:(colorspace.n + alpha) * width * height == len(samples)

  2. 从版本 1.14.13 开始,样本数据会被 复制 到 Pixmap。

__init__(self, doc, xref)#

来自 PDF 图像: 从 PDF doc 中的图像创建一个 Pixmap,该图像由其 xref 标识。所有 Pixmap 属性由图像设置。查看 extract-from-pages.pyextract-from-xref.py ,了解如何使用它来恢复 PDF 中的所有图像。

参数:
  • doc (Document) – 已打开的 PDF 文档。

  • xref (int) – 图像对象的 xref。例如,可以使用 Document.get_page_images() 创建某一页面上所有图像的列表,该方法还会显示每个图像的 xref 数字。

clear_with([value[, irect]])#

初始化样本区域。

参数:
  • value (int) – 如果指定,值范围为 0 到 255。每个像素的每个颜色字节将被设置为此值,如果存在 alpha,则设置为 255(非透明)。如果未指定,则所有字节(包括任何 alpha)将清除为 0x00

  • irect (irect_like) – 要清除的区域。如果省略,则清除整个 Pixmap。只有在指定了 value 时,才可以指定此区域。

tint_with(black, white)#

通过将黑色和/或白色替换为给定的颜色来为 Pixmap 上色,颜色以 sRGB 整数 值表示。仅支持颜色空间 CS_GRAYCS_RGB,其他颜色空间会发出警告并被忽略。

如果颜色空间是 CS_GRAY,将取平均值 (red + green + blue)/3。Pixmap 将就地更改。

参数:
  • black (int) – 将黑色替换为此值。指定 0x000000 不会进行更改。

  • white (int) – 将白色替换为此值。指定 0xFFFFFF 不会进行更改。

示例:

  • tint_with(0x000000, 0xFFFFFF) 不做任何操作。

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

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

gamma_with(gamma)#

对 Pixmap 应用伽马因子,即调亮或调暗图像。颜色空间为 None 的 Pixmap 会发出警告并被忽略。

参数:

gamma (float) – gamma = 1.0 不做任何改变,gamma < 1.0 使图像变亮,gamma > 1.0 使图像变暗。

shrink(n)#

通过将宽度和高度都除以 2:sup:n 来缩小 Pixmap。

参数:

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

备注

使用此方法可以在保留比例的同时减小 Pixmap 的大小。Pixmap 会 “就地” 更改。如果要保留原始图像并具有更细粒度的选择,请使用上述相应的构造函数。

pixel(x, y)#

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

参数:
  • x (int) – 像素的列号,必须在 range(pix.width) 内。

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

返回类型:

list

返回:

包含颜色值的列表,可能还有 alpha 值。列表的长度和内容取决于 Pixmap 的颜色空间和是否存在 alpha。对于 RGBA Pixmap,返回的结果例如是 [r, g, b, a]。所有项都是 range(256) 范围内的整数。

set_pixel(x, y, color)#

版本 1.14.7 新增: 操作位置 (x, y)(列,行)处的像素。

参数:
  • x (int) – 像素的列号,必须在 range(pix.width) 内。

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

  • color (sequence) – 期望的像素值,作为一个整数序列,范围为 range(256)。序列的长度必须与 Pixmap.n 相等,包括任何 alpha 字节。

set_rect(irect, color)#

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

参数:
  • irect (irect_like) – 要填充的矩形区域。实际区域是此参数与 Pixmap.irect 的交集。如果交集为空(或参数无效),则不会进行更改。

  • color (sequence) – 期望的值,作为一个整数序列,范围为 range(256)。序列的长度必须与 Pixmap.n 相等,包括任何 alpha 字节。

返回类型:

bool

返回:

如果矩形无效或与 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)#

版本 1.17.7 新增:

设置 Pixmap 的左上角点的 x 和 y 坐标。

参数:
  • x (int) – x 坐标

  • y (int) – y 坐标

set_dpi(xres, yres)#

版本 1.16.17 新增:

版本 1.18.0 更改: 保存为 PNG 图像时,这些值现在会被存储。

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

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

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

set_alpha(alphavalues, premultiply=1, opaque=None)#

版本 1.18.13 更改:

更改 alpha 值。Pixmap 必须具有 alpha 通道。

参数:
  • alphavalues (bytes,bytearray,BytesIO) – 新的 alpha 值。如果提供,则其长度必须至少为 width * height 。如果省略(None),则所有 alpha 值设置为 255(无透明度)。版本 1.14.13 更改: 现在也接受 io.BytesIO

  • premultiply (bool) – 版本 1.18.13 新增: 是否将颜色分量与 alpha 值预乘。

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

invert_irect([irect])#

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

参数:

irect (irect_like) – 要反转的区域。省略时,反转整个图像。

copy(source, irect)#

source Pixmap 的 irect 部分复制到此 Pixmap 的相应区域。两个 Pixmap 可以有不同的尺寸,并且每个 Pixmap 都可以具有 CS_GRAYCS_RGB 颜色空间,但它们当前 必须 具有相同的 alpha 属性 [4]。复制机制会自动调整源和目标之间的差异,具体如下:

  • 如果从 CS_GRAY 复制到 CS_RGB,则源的灰度值将填充到每个 RGB 组件字节中。

  • 如果反向复制,则 (r + g + b) / 3 将作为目标的灰度值。

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

参数:
  • source (Pixmap) – 源 Pixmap。

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

备注

示例:假设你有两个 Pixmap,pix1pix2,并且你想将 pix2 的右下角四分之一复制到 pix1,使得它从 pix1 的左上角开始。使用以下代码:

>>> # 防护:将 pix1 和 pix2 的左上角设置为 (0, 0)
>>> pix1.set_origin(0, 0)
>>> pix2.set_origin(0, 0)
>>> # 计算 pix2 区域的左上角坐标
>>> x1 = int(pix2.width / 2)
>>> y1 = int(pix2.height / 2)
>>> # 将 pix2 的左上角移动到 (0, 0),
>>> # 使得待复制区域从这里开始:
>>> pix2.set_origin(-x1, -y1)
>>> # 现在复制...
>>> pix1.copy(pix2, (0, 0, x1, y1))
_images/img-pixmapcopy.jpg
save(filename, output=None, jpg_quality=95)#

版本 1.22.0 更改: 新增 直接支持 JPEG 图像。图像质量可以通过参数 “jpg_quality” 控制。

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

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

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

  • jpg_quality (int) – 所需的图像质量,默认值为 95。仅适用于 JPEG 图像,其他格式将忽略此值。此参数在质量与文件大小之间进行权衡。值为 98 时接近无损。较高的值不应提高质量。

抛出:

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

tobytes(output='png', jpg_quality=95)#

版本 1.14.5 新增: 将 Pixmap 返回为指定格式的 bytes 内存对象 – 类似于 save()

版本 1.22.0 更改: 新增 直接支持 JPEG。图像质量可以通过新参数 “jpg_quality” 影响。

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

  • jpg_quality (int) – 所需的图像质量,默认值为 95。仅适用于 JPEG 图像,其他格式将忽略此值。此参数在质量与文件大小之间进行权衡。值为 98 时接近无损。较高的值不应提高质量。

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

抛出:

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

返回类型:

bytes

pdfocr_save(filename, compress=True, language='eng', tessdata=None)#

版本 1.19.0 新增:

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

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

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

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

  • language (str) – 图像中出现的语言。必须以 Tesseract 格式指定,默认值为 “eng”(英文)。对于多种语言,请使用 “+” 分隔的 Tesseract 语言代码,如 “eng+spa”(英语和西班牙语)。

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

备注

如果未安装 Tesseract 或未设置环境变量 “TESSDATA_PREFIX” 指向 tessdata 文件夹,并且未作为参数提供,则会失败。

pdfocr_tobytes(compress=True, language='eng', tessdata=None)#

版本 1.19.0 新增:

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

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

返回:

内存中的 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()#

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

抛出:

ImportError – 如果没有安装 Pillow。

返回:

一个 PIL.Image 对象。

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

使用 Pillow 将 pixmap 写入图像文件。对于 MuPDF 不支持的输出格式,请使用此方法。例如:

  • 格式 JPX、J2K、WebP 等。

  • 存储 EXIF 信息。

  • 如果未提供 dpi 信息,将自动使用存储在 pixmap 中的 xresyres 值。

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

参数:

unmultiply (bool) – 如果 pixmap 的颜色空间是带透明度的 RGB,alpha 值可能已经或尚未与颜色组件(红/绿/蓝)相乘(称为“预乘”)。若要强制撤销预乘,请将此参数设置为 True。要了解更多背景信息,请参考 “预乘 alpha” here

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

自 v1.22.0 起,PyMuPDF 已直接支持 JPEG 输出。建议不再使用此方法进行 JPEG 输出,以提高性能并避免不必要的外部依赖。

抛出:

ImportError – 如果没有安装 Pillow。

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

版本 1.17.3 新增:

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

抛出:

ImportError – 如果没有安装 Pillow。

返回类型:

bytes

warp(quad, width, height)#

版本 1.19.3 新增:

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

参数:
  • quad (quad_like) – 一个包含在 Pixmap.irect 内部(包括边界点)的凸四边形坐标。

  • width (int) – 所需的结果宽度。

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

返回:

一个新的 pixmap,其中四边形的角以顺时针方向映射到 pixmap 的角:quad.ul -> irect.tlquad.ur -> irect.tr,依此类推。

返回类型:

Pixmap

_images/img-warp.png

color_count(colors=False, clip=None)#

版本 1.19.2 新增: 版本 1.19.3 更改:

确定 pixmap 的唯一颜色及其计数。

参数:
  • colors (bool) – (版本 1.19.3 更改) 如果为 True,返回一个颜色像素及其使用计数的字典;否则,仅返回唯一颜色的数量。

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

返回类型:

dict 或 int

返回:

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

备注

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

  • 响应时间取决于 pixmap 的样本大小,对于非常大的 pixmap,可能会超过一秒。

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

color_topusage(clip=None)#

版本 1.19.3 新增:

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

参数:

clip (rect_like) – 一个位于 Pixmap.irect 内的矩形。如果提供,只有这些像素会被考虑。这允许直接检查给定 pixmap 的子矩形,而无需构建子 pixmap。

返回类型:

tuple

返回:

一个元组 (ratio, pixel),其中 0 < ratio <= 1pixel 是颜色的像素值。使用此方法来判断图像是否“几乎”是单色:响应 (0.95, b"x00x00x00") 表示 95% 的像素是黑色。有关示例,请参见 如何使用像素图:检查文本可见性

alpha#

指示 pixmap 是否包含透明度信息。

Type:

bool

digest#

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

Type:

bytes

colorspace#

pixmap 的颜色空间。如果图像被视为所谓的 图像遮罩模板遮罩,则该值可能为 None (当前仅在提取的 PDF 文档图像中发生)。

Type:

Colorspace

stride#

包含图像数据中每行的长度,即 Pixmap.samples 的长度。这主要用于计算目的。以下表达式成立:

  • len(samples) == height * stride

  • width * n == stride

Type:

int

is_monochrome#

版本 1.19.2 新增:

如果是灰度 pixmap 且仅包含黑色和白色,则为 True

Type:

bool

is_unicolor#

版本 1.19.2 新增:

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

Type:

bool

irect#

包含 pixmap 的 IRect

Type:

IRect

samples#

所有像素的颜色和(如果 Pixmap.alpha 为 true)透明度值。这是一个 width * height * n 字节的区域。每 n 字节定义一个像素。每 n 字节依次表示一个像素,按扫描线顺序排列。后续扫描线紧接着排列,不进行填充。例如,对于 RGBA 颜色空间,samples 是一个字节序列,如 …, R, G, B, A, …,其中四个字节 R, G, B, A 定义一个像素。

该区域可以传递给其他图形库,如 PIL(Python Imaging Library),以进行额外处理,例如将 pixmap 保存为其他图像格式。

备注

  • 底层数据通常是一个 大型 内存区域,每次访问时会为此属性创建 bytes 副本:例如,一个 RGB 渲染的字母页面的 samples 大小接近 1.4 MB。因此,请考虑将其分配给新变量,或使用 memoryview 版本 Pixmap.samples_mv (v1.18.17 新增)。

  • 对底层数据的任何更改仅在再次访问此属性时才可见。这与使用 memoryview 版本不同。

Type:

bytes

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 被销毁后,任何尝试使用内存视图的操作都会因为 ValueError 失败。

Type:

memoryview

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:

int

size#

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

Type:

int

width#
w#

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

Type:

int

height#
h#

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

Type:

int

x#

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

Type:

int

y#

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

Type:

int

n#

每个像素的组件数量。这个数值取决于颜色空间和 alpha。如果颜色空间不是 None (例如模板遮罩),那么 Pixmap.n - Pixmap.alpha == pixmap.colorspace.n 为真。如果颜色空间是 None,则 n == alpha == 1

Type:

int

xres#

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

Type:

int

yres#

垂直分辨率(每英寸点数 dpi)。请参阅 resolution。不能直接更改 – 使用 Pixmap.set_dpi()

Type:

int

interpolate#

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

Type:

bool

支持的输入图片格式#

Supported Input Image Formats

以下文件类型被支持作为 输入 来构建 pixmaps: BMP, JPEG, GIF, TIFF, JXR, JPX, PNG, PAM 和所有 Portable Anymap 系列(PBM, PGM, PNM, PPM)。这种支持是双重的:

  1. 通过 Pixmap(filename)Pixmap(byterray) 直接创建一个 pixmap。该 pixmap 将具有由图像决定的属性。

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

SVG 图像 仅通过上述第 2 种方法支持,而不能直接作为 pixmaps。但请记住:结果是一个 光栅图像,正如所有 pixmap 一样 [3]

The following file types are supported as input to construct pixmaps: BMP, JPEG, GIF, TIFF, JXR, JPX, PNG, PAM and all of the Portable Anymap family (PBM, PGM, PNM, PPM). This support is two-fold:

  1. Directly create a pixmap with Pixmap(filename) or Pixmap(byterray). The pixmap will then have properties as determined by the image.

  2. Open such files with pymupdf.open(…). The result will then appear as a document containing one single page. Creating a pixmap of this page offers all the options available in this context: apply a matrix, choose colorspace and alpha, confine the pixmap to a clip area, etc.

SVG images are only supported via method 2 above, not directly as pixmaps. But remember: the result of this is a raster image as is always the case with pixmaps [1].

支持的输出图片格式#

Supported Output Image Formats

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

格式

颜色空间

透明度

扩展名

描述

jpg, jpeg

gray, rgb, cmyk

no

.jpg, .jpeg

联合图像专家组

pam

gray, rgb, cmyk

yes

.pam

可移植任意映射

pbm

gray, rgb

no

.pbm

可移植位图

pgm

gray, rgb

no

.pgm

可移植灰度图

png

gray, rgb

yes

.png

可移植网络图形

pnm

gray, rgb

no

.pnm

可移植任意图形

ppm

gray, rgb

no

.ppm

可移植像素图

ps

gray, rgb, cmyk

no

.ps

Adobe PostScript 图像

psd

gray, rgb, cmyk

yes

.psd

Adobe Photoshop 文档

备注

  • 并非所有图像文件类型在所有操作系统平台上都受到支持(或至少常见)。例如 PAM 和可移植任意映射格式在 Windows 上较为罕见或甚至未知。

  • 特别是在涉及 CMYK 颜色空间时,您可以通过 rgb_pix = pymupdf.Pixmap(pymupdf.csRGB, cmyk_pix) 将 CMYK pixmap 转换为 RGB pixmap,然后以所需格式保存。

  • 如上所示,MuPDF 的图像支持范围在输入和输出方面有所不同。在两者都支持的格式中,PNG 和 JPEG 可能是最常见的。

  • 我们还推荐将 “ppm” 格式用于 tkinter 的 PhotoImage 方法,像这样: tkimg = tkinter.PhotoImage(data=pix.tobytes(“ppm”)) (请参见教程)。这 非常 快(比 PNG 快 60 倍)。

A number of image output formats are supported. You have the option to either write an image directly to a file (Pixmap.save()), or to generate a bytes object (Pixmap.tobytes()). Both methods accept a string identifying the desired format (Format column below). Please note that not all combinations of pixmap colorspace, transparency support (alpha) and image format are possible.

Format

Colorspaces

alpha

Extensions

Description

jpg, jpeg

gray, rgb, cmyk

no

.jpg, .jpeg

Joint Photographic Experts Group

pam

gray, rgb, cmyk

yes

.pam

Portable Arbitrary Map

pbm

gray, rgb

no

.pbm

Portable Bitmap

pgm

gray, rgb

no

.pgm

Portable Graymap

png

gray, rgb

yes

.png

Portable Network Graphics

pnm

gray, rgb

no

.pnm

Portable Anymap

ppm

gray, rgb

no

.ppm

Portable Pixmap

ps

gray, rgb, cmyk

no

.ps

Adobe PostScript Image

psd

gray, rgb, cmyk

yes

.psd

Adobe Photoshop Document

备注

  • Not all image file types are supported (or at least common) on all OS platforms. E.g. PAM and the Portable Anymap formats are rare or even unknown on Windows.

  • Especially pertaining to CMYK colorspaces, you can always convert a CMYK pixmap to an RGB pixmap with rgb_pix = pymupdf.Pixmap(pymupdf.csRGB, cmyk_pix) and then save that in the desired format.

  • As can be seen, MuPDF’s image support range is different for input and output. Among those supported both ways, PNG and JPEG are probably the most popular.

  • We also recommend using “ppm” formats as input to tkinter’s PhotoImage method like this: tkimg = tkinter.PhotoImage(data=pix.tobytes(“ppm”)) (also see the tutorial). This is very fast (60 times faster than PNG).

Footnotes


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