为简洁起见,我将在这里对数字进行四舍五入。
案例一
让我们简单分析一下您的内容流摘录:
假设前面的指令让用户空间坐标系和剪辑路径处于默认状态,所以我们可以假设一个身份当前变换矩阵(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.12 和289.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]
(好吧,我希望是这样,但也许我在某处计算错误......)