【问题标题】:how to draw grid lines when camera is open avcapturemanager [closed]打开相机时如何绘制网格线avcapturemanager [关闭]
【发布时间】:2013-08-14 08:17:31
【问题描述】:

我想像打开相机时出现的那样显示网格线。我正在使用 AVCaptureManager。我应该使用核心图形来绘制网格线吗?这些网格线的大小是多少?

谢谢

【问题讨论】:

    标签: ios grid avcapture


    【解决方案1】:

    您确实可以添加自定义视图作为覆盖在您的相机视图上,以使用 QuartzCore 绘制网格。

    这就是我在我的应用 Subvision 中的做法:

    我用来绘制它的代码(注意:我的网格是可调整的,所以它可以是 10x10、2x2 等):

    // -------------------------------------------------------------------------------
    // Used for drawing the grids ontop of the view port
    // -------------------------------------------------------------------------------
    - (void)drawRect:(CGRect)rect
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetLineWidth(context, 0.5);
        CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    
        // ---------------------------
        // Drawing column lines
        // ---------------------------
    
        // calculate column width
        CGFloat columnWidth = self.frame.size.width / (self.numberOfColumns + 1.0);
    
        for(int i = 1; i <= self.numberOfColumns; i++)
        {
            CGPoint startPoint;
            CGPoint endPoint;
    
            startPoint.x = columnWidth * i;
            startPoint.y = 0.0f;
    
            endPoint.x = startPoint.x;
            endPoint.y = self.frame.size.height;
    
            CGContextMoveToPoint(context, startPoint.x, startPoint.y);
            CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
            CGContextStrokePath(context);
        }
    
        // ---------------------------
        // Drawing row lines
        // ---------------------------
    
        // calclulate row height
        CGFloat rowHeight = self.frame.size.height / (self.numberOfRows + 1.0);
    
        for(int j = 1; j <= self.numberOfRows; j++)
        {
            CGPoint startPoint;
            CGPoint endPoint;
    
            startPoint.x = 0.0f;
            startPoint.y = rowHeight * j;
    
            endPoint.x = self.frame.size.width;
            endPoint.y = startPoint.y;
    
            CGContextMoveToPoint(context, startPoint.x, startPoint.y);
            CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
            CGContextStrokePath(context);
        }
    }
    

    在我的 GridView 类中,我定义了 2 个属性 numberOfRows 和 numberOfColumns:

    #import <UIKit/UIKit.h>
    
    @interface GridView : UIView
    
    @property (nonatomic, assign) int numberOfColumns;
    @property (nonatomic, assign) int numberOfRows;
    
    @end
    

    这样做意味着我可以修改这两个值并拥有无限可调的网格细分。

    【讨论】:

    • 太棒了,这就是我要找的东西
    • 如何将其添加到叠加层?如果我将 UIView 子类化为一个名为 GridView 的类,然后尝试这个,drawRect 永远不会被调用。 GridView *gridView = [[GridView alloc] init]; gridView.numberOfColumns = 10; gridView.numberOfRows = 10; [cameraUI setCameraOverlayView:gridView];
    • 需要调用[gridView setNeedsDisplay];每次更改 numberOfRows 或 numberOfCols 时。这将调用 gridView 的 drawRect: 方法。
    • 任何人都可以将代码转换为swift4语法@sin
    【解决方案2】:

    创建一个 UIImageView 用于 cameraOverlayView。

    使用 UIImagePickerController 和图像作为您的“网格线”。在制作网格线图像文件时,请务必使用透明背景 - 而不是不透明的白色。

    UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"overlay.png"]];
    
    CGRect overlayRect = CGRectMake(0, 0, overlayImage.image.size.width, overlayImage.image.size.height);
    
    [overlayImage setFrame:overlayRect];
    
    [yourImagePickerController setCameraOverlayView:overlayImage];
    

    【讨论】:

    • 我没有使用 ImagePickerViewController
    • 然后你可以通过 COreGraphics 或 QuartZCore 来绘制它......根据你的要求......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多