从IOS中的UIImage获取坐标和框架

Posted

技术标签:

【中文标题】从IOS中的UIImage获取坐标和框架【英文标题】:get coordinate and frame from UIImage in IOS 【发布时间】:2016-09-27 09:38:54 【问题描述】:

如何从UIImage 获取形状框架,因为我使用了类似的图像

请任何人帮助我实现这一目标。

【问题讨论】:

你需要在 Objective C 或 swift 中 我需要快速代码@Anbu.Karthik 请看这个链接:toptal.com/machine-learning/… 【参考方案1】:

您可以从其中包含图像的 imageView 框架或图像自身获取此信息。既然你还没有说你是否使用 imageView ,这里是两者:

从 imageView 获取大小和坐标:

let x:CGFloat = imageView.frame.origin.x
let y:CGFloat = imageView.frame.origin.y

let width:CGFloat = imageView.frame.size.width
let height:CGFloat = imageView.frame.size.height

从 UIImage 获取尺寸(没有坐标):

let width:CGFloat = image.size.width
let height:CGFloat = image.size.height

【讨论】:

【参考方案2】:

从图像中读取像素,并在从图像中获取CGRect 后与您的设备宽度和高度进行比较。

- (CGRect)getRectFromImage:(UIImage*)image


    // First get the image into your data buffer
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                 bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);


    int x = 0;
    int y = 0;
    int xPos = 0;
    int yPos = 0;

    int xMax = 0;
    int yMax = 0;


    for (x = 0; x < width; x++) 
        for (y = 0; y < height; y++) 
            unsigned char alphaByte = rawData[(y*bytesPerRow)+(x*bytesPerPixel)+3];
            if (alphaByte > 0) 

             if (xPos == 0) 
                xPos = x;
            

            if (yPos == 0) 
                yPos = y;
                         
                if (x < xPos) 
                    xPos = x;
                

                if (y < yPos) 
                    yPos = y;
                

                if (x > xMax) 
                    xMax = x;
                

                if (y > yMax) 
                    yMax = y;
                
            
        
    

    NSLog(@"(%i,%i,%i,%i)", xPos, yPos,xMax-xPos,yMax-yPos);


    free(rawData);

    return CGRectMake(xPos, yPos, xMax-xPos, yMax-yPos);

【讨论】:

【参考方案3】:

Swift 3 Xcode 8 。 它仅适用于viewDidAppear 函数

@IBOutlet var myImage: UIImageView!

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)

    let Height = myImage.frame.height
    let Width = myImage.frame.width
    let xPosition = myImage.frame.minX
    let yPosition = myImage.frame.minY

    print("Height: \(Height), width: \(Width), xPosition: \(xPosition), yPosition: \(yPosition)")


【讨论】:

我需要形状框架而不是图像视图 我有很多不同形状的图像和不同的位置,特别是像这张图片这样的图像

以上是关于从IOS中的UIImage获取坐标和框架的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?

iOS在UITabBar中更改UITabBarButton的框架

iOS - 获取 UITabBarItem 的 UIImageView/UIImage 的框架

iOS - 根据坐标更改 UIImage 的方向

UIImage 混合模式问题

在 UIScrollView 中获取 UIImage 可见部分的正确坐标