gpt4 book ai didi

ios - 仿射变换后得到真实帧

转载 作者:行者123 更新时间:2023-11-29 11:50:38 24 4
gpt4 key购买 nike

目标是在 pdf 页面中获取真实的框架以识别搜索到的字符串,我正在使用 PDFKitten lib 来突出显示搜索到的文本并试图弄清楚如何获取突出显示文本的框架。接下来是核心方法:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSetFillColorWithColor(ctx, [[UIColor whiteColor] CGColor]);
CGContextFillRect(ctx, layer.bounds);

// Flip the coordinate system
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);

// Transform coordinate system to match PDF
NSInteger rotationAngle = CGPDFPageGetRotationAngle(pdfPage);
CGAffineTransform transform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFCropBox, layer.bounds, -rotationAngle, YES);
CGContextConcatCTM(ctx, transform);

CGContextDrawPDFPage(ctx, pdfPage);

if (self.keyword)
{
CGContextSetFillColorWithColor(ctx, [[UIColor yellowColor] CGColor]);
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
for (Selection *s in self.selections)
{
NSLog(@"layer.bounds = %f, %f, %f, %f", layer.bounds.origin.x, layer.bounds.origin.y, layer.bounds.size.width, layer.bounds.size.height);
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, s.transform);
NSLog(@"s.frame = %f, %f, %f, %f", s.frame.origin.x, s.frame.origin.y, s.frame.size.width, s.frame.size.height);
CGContextFillRect(ctx, s.frame);
CGContextRestoreGState(ctx);
}
}
}

层的大小为 (612.000000, 792.000000),但 s.frame 的大小为 (3.110400, 1.107000)。如何从填充为黄色的矩形中获取真实的框架?

最佳答案

正如 Matt 所说,除非变换是恒等变换,否则 View /层的框架属性是无效的。

如果你想使用变换来变换一些矩形,那么 CGRect 结构就没有用了,因为 CGRect 指定了原点和大小,并假定矩形的其他 3 个点从原点向右/向下移动.

为了创建一个变换的矩形,您需要为未变换的框架矩形的左上角、右上角、左下角和右下角构建 4 个点,然后对这些点应用变换,之前 将转换应用于 View 。

请参阅函数 CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)CGAffineTransform 应用于一个点。

完成后,您可以使用变换后的点来构建包含多边形的贝塞尔曲线路径,该多边形是变换后的矩形。 (变换后可能是也可能不是矩形,唯一可靠的表示方法是用 4 个点来描述一个四边形。)

关于ios - 仿射变换后得到真实帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com