在图像view.image上绘制矩形不能正确缩放

  • 我从一个imageView.image (一张照片)开始。
  • 我将(POST) imageView.image提交给远程服务(Microsoft人脸检测)进行处理。
  • 远程服务为图像上每个检测到的脸部返回CGRect的JSON。
  • 我将JSON提供给我的UIView来绘制矩形。 我使用{0, 0, imageView.image.size.width, imageView.image.size.height}框架启动我的UIView。 < - 我的想法是一个相当于imageView.image大小的框架
  • 加入我的UIView作为一个子视图self.imageView OR self.view (都尝试)
  • 结束结果:绘制了矩形,但它们在imageView.image上没有正确显示。 也就是说,为每个面生成的CGRects应该是相对于图像坐标空间的,这是由远程服务返回的,但是一旦添加了我的自定义视图,它们就会显示出来。

    我相信我可能会遇到某种缩放问题,如果我将CGRects / 2中的每个值分开(作为一个测试),我可以得到一个近似值,但仍然是关闭的。 microsoft文档说明检测到的面与矩形一起返回, 以像素为单位指示图像面的位置。 然而,在绘制我的道路时,他们不是被视为点吗?

    另外,我不应该使用等价于imageView.image的框架来启动我的视图,以便视图与提交的图像匹配相同的坐标空间。

    这里是一个屏幕截图的例子,如果我尝试通过将它们除以2来缩小每个CGRect。

    在这里输入图像描述

    我是iOS新手,从书本中脱离出来,将其作为自我练习。 我可以根据需要提供更多的代码。 预先感谢您的洞察力!

    编辑1

    我为每个矩形添加一个子视图,因为我通过以下方法在(void)viewDidAppear:(BOOL)animated期间遍历包含每个面的矩形的面元属性数组

    - (void)buildFaceRects {
    
        // build an array of CGRect dicts off of JSON returned from analized image
        NSMutableArray *array = [self analizeImage:self.imageView.image];
    
        // enumerate over array using block - each obj in array represents one face
       [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
           // build dictionary of rects and attributes for the face
           NSDictionary *json = [NSDictionary dictionaryWithObjectsAndKeys:obj[@"attributes"], @"attributes", obj[@"faceId"], @"faceId", obj[@"faceRectangle"], @"faceRectangle", nil];
    
           // initiate face model object with dictionary
           ZGCFace *face = [[ZGCFace alloc] initWithJSON:json];
    
           NSLog(@"%@", face.faceId);
           NSLog(@"%d", face.age);
           NSLog(@"%@", face.gender);
           NSLog(@"%f", face.faceRect.origin.x);
           NSLog(@"%f", face.faceRect.origin.y);
           NSLog(@"%f", face.faceRect.size.height);
           NSLog(@"%f", face.faceRect.size.width);
    
           // define frame for subview containing face rectangle
           CGRect imageRect = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
    
           // initiate rectange subview with face info
           ZGCFaceRectView *faceRect = [[ZGCFaceRectView alloc] initWithFace:face frame:imageRect];
    
           // add view as subview of imageview (?)
           [self.imageView addSubview:faceRect];
    
       }];
    
    }
    

    编辑2:

        /* Image info */
        UIImageView *iv = self.imageView;
        UIImage *img = iv.image;
        CGImageRef CGimg = img.CGImage;
    
        // Bitmap dimensions [pixels]
        NSUInteger imgWidth = CGImageGetWidth(CGimg);
        NSUInteger imgHeight = CGImageGetHeight(CGimg);
        NSLog(@"Image dimensions: %lux%lu", imgWidth, imgHeight);
    
        // Image size pixels (size * scale)
        CGSize imgSizeInPixels = CGSizeMake(img.size.width * img.scale, img.size.height * img.scale);
        NSLog(@"image size in Pixels: %fx%f", imgSizeInPixels.width, imgSizeInPixels.height);
    
        // Image size points
        CGSize imgSizeInPoints = img.size;
        NSLog(@"image size in Points: %fx%f", imgSizeInPoints.width, imgSizeInPoints.height);
    
    
    
           // Calculate Image frame (within imgview) with a contentMode of UIViewContentModeScaleAspectFit
           CGFloat imgScale = fminf(CGRectGetWidth(iv.bounds)/imgSizeInPoints.width, CGRectGetHeight(iv.bounds)/imgSizeInPoints.height);
           CGSize scaledImgSize = CGSizeMake(imgSizeInPoints.width * imgScale, imgSizeInPoints.height * imgScale);
           CGRect imgFrame = CGRectMake(roundf(0.5f*(CGRectGetWidth(iv.bounds)-scaledImgSize.width)), roundf(0.5f*(CGRectGetHeight(iv.bounds)-scaledImgSize.height)), roundf(scaledImgSize.width), roundf(scaledImgSize.height));
    
    
           // initiate rectange subview with face info
           ZGCFaceRectView *faceRect = [[ZGCFaceRectView alloc] initWithFace:face frame:imgFrame];
    
           // add view as subview of image view
           [iv addSubview:faceRect];
    
       }];
    

    我们有几个问题:

  • 微软返回像素和iOS使用点。 它们之间的区别仅仅在于屏幕尺寸。 例如iPhone 5:1 pt = 2 px,3GS 1px = 1 pt。 查看iOS文档以获取更多信息。

  • 您的UIImageView的框架不是图像框架。 当Microsofts返回一张脸的框架时,它会将其返回到图像的框架中,而不是返回到UIImageView的框架中。 所以我们有一个坐标系问题。

  • 如果您使用Autolayout,请注意时间。 当调用ViewDidLoad:时,由约束设置的视图的框架与在屏幕上看到的框架不同。

  • 解答:

    我只是一个只读的Objective C开发人员,所以我不能给你代码。 我可以在Swift中,但没有必要。

  • 将像素转换为点。 这很简单:使用比例。

  • 使用你所做的来定义脸部的框架。 然后,您必须将您从图像框架坐标系确定的坐标移动到UIImageView坐标系。 这不太容易。 这取决于你的UIImageView的contentMode。 但我很快就在互联网上找到关于它的信息。

  • 如果使用AutoLayout,则在AutoLayout完成时添加面部框架以计算布局。 所以当调用ViewDidLayoutSubview:时。 或者,更好的方法是使用约束来设置UIImageView中的帧。

  • 我希望足够清楚。

    一些链接:

  • iOS绘图概念

  • 在UIImageView中显示的图像帧

  • 链接地址: http://www.djcxy.com/p/14385.html

    上一篇: Draw rectangles on image view.image not scaling properly

    下一篇: ios viewcontroller view graph live with Mutable Array