如何计算以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' 将如何改变部分图像的计算?
After removing the 're' and 'W*'
需要另一个关于相同场景的答案。
我试过的
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.12
和 289.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]
(好吧,我希望是这样,但也许我在某些计算中出错了...)
我正在尝试计算显示图像坐标。但实际图像显示的比下面显示的更大(图 1)。但是我们只能看到图像的一部分。我想计算矩阵的变换方式(显示图像坐标的计算)。
图 1
内容流如下所示
当我将第一个 q cm 与第二个 q cm 相乘时得到的坐标是
[-122.196, 356.535, 484.061, 759.372]
但这些是完整的图像坐标。 're' 将如何改变部分图像的计算?
After removing the 're' and 'W*'
需要另一个关于相同场景的答案。
我试过的
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.12
和 289.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]
(好吧,我希望是这样,但也许我在某些计算中出错了...)