【问题标题】:How to calculate viewing BBox of an image in pdf?如何计算pdf中图像的查看BBox?
【发布时间】:2021-06-17 14:22:55
【问题描述】:

我正在尝试计算显示图像坐标。但实际图像显示的比下面显示的要大(图 1)。但是我们只能看到图像的一部分。我想计算矩阵是如何转换的(计算显示的图像坐标)。 图1

内容流如下所示

当我将第一个 q cm 乘以第二个 q cm 时得到的坐标是

[-122.196, 356.535, 484.061, 759.372]

但这些都是完整的图像坐标。 're' 将如何改变部分图像的计算?

File

original pdf

After removing the 're' and 'W*'

需要关于同一场景的另一个答案。

second file

我尝试了什么

0.24   0    0
0     -0.24 0
0    850    1

're' 计算到上面 CTM 并且它会给出

[595.92  0  0  7.05]

nex cm 指令变成 CTM 并且看起来像

1    0    0
0    1    0
262  404  1

结果矩阵将是什么 我该如何计算它?

【问题讨论】:

  • 恐怕我不太明白你在找什么。
  • 请在 acrobat 中打开 pdf 并单击图像顶部显示更大的 bbox ehci 在 pdf 之外。图像的某些部分被隐藏,只能看到图像的一部分。它是如何显示的以及如何计算裁剪后的图像 bbox?
  • 我添加了原始文件,删除后重新,W* 文件。但有一件事我不明白 re 和 W* 如何影响图像的查看以及计算如何变化?
  • @mkl 我添加了一个新用例,你能看一下吗?
  • 注意,您的新示例似乎是关于表单 Xobject,而不是图像 Xobject。 (该表单 Xobject 本身可能托管一个图像 Xobject,但这无法从您添加到问题中的数据中确定。我稍后会检查 pdf 本身。)

标签: pdf pdfbox


【解决方案1】:

为简洁起见,我将在这里对数字进行四舍五入。

案例一

让我们简单分析一下您的内容流摘录:

假设前面的指令让用户空间坐标系和剪辑路径处于默认状态,所以我们可以假设一个身份当前变换矩阵(CTM)和一个包含整个的剪辑路径页面。

第一条指令

.24 0 0 -.24 0 850 cm

然后将 CTM 更改为

0.24   0    0
0     -0.24 0
0    850    1

因此,矩形路径被定义并用作此后的剪辑路径

169 349.49 1038.37 1670.15 re

在默认用户空间中具有坐标(左下、右上):

[40.56 365.29 289.77 766.12]

然后下一个cm指令

2517.74 0 0 -1670.15 -504.99 2019.64 cm

将 CTM 更改为

 604.26   0    0
   0    400.84 0
-121.2  365.29 1

所以下面的位图图像

/Im0 Do

在默认用户空间中的坐标(左下,右上)处绘制:

[-121.2 365.29 483.06 766.13]

该区域部分位于剪辑路径之外,因此我们通过将这些坐标与剪辑路径相交得到用户空间坐标中的可见图像区域,从而得到 p>

[40.56 365.29 289.77 766.12]

所以这些是您正在寻找的坐标。

请注意,通常剪辑路径可以具有任意形式,并且图像绘制时的 CTM 不仅可以缩放、镜像或平移(导致平行于轴的矩形),还可以旋转或倾斜(导致菱形或不平行于轴的东西)。因此,计算交集并从结果中找出意义通常更加复杂。


在你问的评论中

但我仍然需要更清楚一点,在“是”之后你是如何得到 [40.56 365.29 289.77 766.12] 这个的。计算是如何进行的。

我通过将 CTM 应用于矩形的两个对角对角来得到这些。

要得到两个这样的角

169 349.49 1038.37 1670.15 re

我首先在169 349.49 处取了锚点,第二个点是添加了宽度和高度的锚点1207.37 2019.64

然后我将 CTM 应用于这两点

                 0.24   0    0
[169 349.49 1] × 0     -0.24 0 = [40.56 766.12 1]
                 0    850    1

                      0.24   0    0
[1207.37 2019.64 1] × 0     -0.24 0 = [289.77 365.29 1]
                      0    850    1

所以我在40.56 766.12289.77 365.29 得到了转换后的角。

由于镜像,结果点不是从左下到右上,而是从左上到右下。因此,我将矩形标准化为[40.56 365.29 289.77 766.12]

请注意,此计算利用了 CTM 仅缩放、镜像和平移的事实。如果它也旋转或倾斜,我将不得不将 CTM 应用于矩形的所有角(或至少三个角),然后使用它们跨越的菱形。

案例2

在编辑您的问题时,您添加了另一个案例:

这个例子表明必须首先检查有问题的 XObject。

如果假设 Fm0 是一个图像 XObject,则该图像将以 .24×.24 默认用户空间单位正方形(一个小点)绘制。

但是Fm0 不是一个图像XObject,而是一个表单XObject,它反过来从它自己的资源中显示一个图像XObject。因此,这是计算中的另一个步骤:

第一条指令

.24 0 0 -.24 0 850 cm

然后将 CTM 更改为

0.24   0    0
0     -0.24 0
0    850    1

因此,矩形路径被定义并用作此后的剪辑路径

0 0 2483.33 3512.32 re

在默认用户空间中具有坐标(左下、右上):

[0 7.04 596 850]

然后下一个cm指令

1 0 0 1 262 404 cm

将 CTM 更改为

 0.24   0    0
 0     -0.24 0
62.88 750.04 1

由于

/Fm0 Do

然后我们必须继续使用 XObject Fm0。首先它有一个边界框入口

[ 0 0 1959 1306 ] 

将 CTM 应用到 this 我们在默认用户空间中得到一个边界框

[62.88 436.6 533.04 750.04]

必须与剪辑路径相交。

Fm0的相关内容是

0.72 196.505 1957.892 913.266 re
W* n
q
/GS0 gs
1957.8926 0 0 -1304.21912 0.7203979 1305.13342 cm
/Im0 Do
Q

因此,矩形路径定义并与此后的剪辑路径相交

0.72 196.51 1957.89 913.27 re

在默认用户空间中具有坐标(左下、右上):

[63.05 483.69 532.95 702.88]

然后下一个cm指令

1957.89 0 0 -1304.22 0.72 1305.13 cm

将 CTM 更改为

469.89   0    0
  0    313.01 0
 63.05 436.81 1

所以下面的位图图像

/Im0 Do

在默认用户空间中的坐标(左下,右上)处绘制:

[63.05 436.81 532.94 749.82]

此时有效的剪辑路径是矩形的交点

[0 7.04 596 850]
[62.88 436.6 533.04 750.04]
[63.05 483.69 532.95 702.88]

原来是长方形

[63.05 483.69 532.95 702.88]

因此,该绘制图像的可见区域是

[63.05 483.69 532.94 702.88]

(好吧,我希望是这样,但也许我在某处计算错误......)

【讨论】:

  • 是的,我只在寻找这些坐标。但是我仍然需要更清楚一点,在“是”之后你是如何得到 [40.56 365.29 289.77 766.12] 这个的。计算是如何发生的。谢谢回答?
  • 查看我对答案的补充。
猜你喜欢
  • 1970-01-01
  • 2013-10-28
  • 2019-05-15
  • 2021-09-24
  • 1970-01-01
  • 2017-02-10
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多