如何计算以pdf格式查看图像的BBox?

How to calculate viewing BBox of an image in pdf?

我正在尝试计算显示图像坐标。但实际图像显示的比下面显示的更大(图 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]

下一条 cm 指令变为 CTM,看起来像

1    0    0
0    1    0
262  404  1

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

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

案例一

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

假设前面的指令使用户 space 坐标系和剪辑路径处于默认状态,因此我们可以假设 identity 当前变换矩阵( 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

有,在默认用户space,坐标(左下,右上):

[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

在默认用户space中绘制,坐标(左下,右上):

[-121.2 365.29 483.06 766.13]

这个区域部分在裁剪路径之外,所以我们通过相交在用户space坐标中得到可见图像区域] 那些与剪辑路径的坐标,导致

[40.56 365.29 289.77 766.12]

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

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


在您提问的评论中

But still I need bit more clarity to, after 're' how you got [40.56 365.29 289.77 766.12] this. How the calculation is happening.

我通过将 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 应用于矩形的所有角(或至少三个角),然后使用它们跨越的菱形。

案例二

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

此示例表明必须首先检查有问题的 XObject。

如果假设 Fm0 是一个图像 XObject,图像将以 .24×.24 默认用户 space 单位正方形绘制,一个小点.

但是 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

有,在默认用户space,坐标(左下,右上):

[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 应用于此,我们在

的默认用户 space 中得到一个边界框
[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

有,在默认用户space,坐标(左下,右上):

[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

在默认用户space中绘制,坐标(左下,右上):

[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]

(好吧,我希望是这样,但也许我在某些计算中出错了...)