Ios 获取UIImageView中UIImage上平移的像素位置

Ios 获取UIImageView中UIImage上平移的像素位置,ios,uiimage,scaling,Ios,Uiimage,Scaling,我需要的是实际的pixcel位置,不是相对于UIImageView框架的位置,而是UIImage上的实际pixcel位置 UIpangesture识别器提供UIimageView中的位置,因此它没有任何用处 我可以将x和y与比例相乘,但UIImage比例始终为0 我需要从UIImage中裁剪一个圆形区域,使其模糊并将其完全放置在同一位置 流量: 使用以下命令从UIimage裁剪圆形区域:g CGImageCreateWithImageInRect 然后使用:[[UIBezierPath bezi

我需要的是实际的pixcel位置,不是相对于UIImageView框架的位置,而是UIImage上的实际pixcel位置

UIpangesture识别器提供UIimageView中的位置,因此它没有任何用处

我可以将x和y与比例相乘,但UIImage比例始终为0

我需要从UIImage中裁剪一个圆形区域,使其模糊并将其完全放置在同一位置

流量:

  • 使用以下命令从UIimage裁剪圆形区域:g CGImageCreateWithImageInRect

  • 然后使用:[[UIBezierPath bezierPathWithRoundedRect:

  • 使用CIGaussianBlur模糊圆形rect图像

  • 将圆形矩形模糊图像放置在x,y位置


  • 在第一步中,我需要用户点击的实际像素位置,这取决于图像视图内容模式

    对于“按比例填充”模式,只需将坐标乘以图像与视图的比率:

    CGPoint pointOnImage = CGPointMake(pointOfTouch.x*(imageSize.width/frameSize.width), pointOfTouch.y*(imageSize.height/frameSize.height));
    
    对于所有其他模式,您需要计算视图中的实际图像帧,然后使用不同的过程

    从注释添加方面匹配模式:

    对于纵横比拟合,您需要计算实际图像帧,该图像帧可以小于其中一个维度中的图像视图帧,并且位于中心:

        CGSize imageSize; // the original image size
        CGSize imageViewSize; // the image view size
    
        CGFloat imageRatio = imageSize.width/imageSize.height;
        CGFloat viewRatio = imageViewSize.width/imageViewSize.height;
    
        CGRect imageFrame = CGRectMake(.0f, .0f, imageViewSize.width, imageViewSize.height);
    
        if(imageRatio > viewRatio) {
            // image has room on top and bottom but fits perfectly on left and right
            CGSize displayedImageSize = CGSizeMake(imageViewSize.width, imageViewSize.width / imageRatio);
            imageFrame = CGRectMake(.0f, (imageViewSize.height-displayedImageSize.height)*.5f, displayedImageSize.width, displayedImageSize.height);
        }
        else if(imageRatio < viewRatio) {
            // image has room on left and right but fits perfectly on top and bottom
            CGSize displayedImageSize = CGSizeMake(imageViewSize.height * imageRatio, imageViewSize.height);
            imageFrame = CGRectMake((imageViewSize.width-displayedImageSize.width)*.5f, .0f, displayedImageSize.width, displayedImageSize.height);
        }
    
        // transform the coordinate
        CGPoint locationInImageView; // received from touch
    
        CGPoint locationOnImage = CGPointMake(locationInImageView.x, locationInImageView.y); // copy the original point
        locationOnImage = CGPointMake(locationOnImage.x - imageFrame.origin.x, locationOnImage.y - imageFrame.origin.y); // translate to fix the origin
        locationOnImage = CGPointMake(locationOnImage.x/imageFrame.size.width, locationOnImage.y/imageFrame.size.height); // transform to relative coordinates
        locationOnImage = CGPointMake(locationOnImage.x*imageSize.width, locationOnImage.y*imageSize.height); // scale to original image coordinates
    
    CGSize imageSize;//原始图像大小
    CGSize imageViewSize;//图像视图大小
    CGFloat imageRatio=imageSize.width/imageSize.height;
    CGFloat viewRatio=imageViewSize.WITH/imageViewSize.height;
    CGRect imageFrame=CGRectMake(.0f、.0f、imageViewSize.WITH、imageViewSize.height);
    如果(imageRatio>viewRatio){
    //图片的顶部和底部都有空间,但左右两侧都非常合适
    CGSize displayedImageSize=CGSizeMake(imageViewSize.width、imageViewSize.width/imageRatio);
    imageFrame=CGRectMake(.0f,(imageViewSize.height displayedImageSize.height)*.5f,displayedImageSize.width,displayedImageSize.height);
    }
    else if(图像比率<视图比率){
    //图片的左右两侧都有空间,但顶部和底部都非常合适
    CGSize displayedImageSize=CGSizeMake(imageViewSize.height*imageRatio,imageViewSize.height);
    imageFrame=CGRectMake((imageViewSize.width displayedImageSize.width)*.5f、.0f,displayedImageSize.width,displayedImageSize.height);
    }
    //变换坐标
    CGPoint locationInImageView;//从触摸屏接收
    CGPoint LOCATIONINIMAGE=CGPointMake(locationInImageView.x,locationInImageView.y);//复制原始点
    locationOnImage=CGPointMake(locationOnImage.x-imageFrame.origin.x,locationOnImage.y-imageFrame.origin.y);//转换以修复原点
    locationOnImage=CGPointMake(locationOnImage.x/imageFrame.size.width,locationOnImage.y/imageFrame.size.height);//转换为相对坐标
    locationOnImage=CGPointMake(locationOnImage.x*imageSize.width,locationOnImage.y*imageSize.height);//缩放到原始图像坐标
    

    如果要转换为aspect fill,只需注意,您只需在两个if语句中交换

    这取决于图像查看内容模式

    对于“按比例填充”模式,只需将坐标乘以图像与视图的比率:

    CGPoint pointOnImage = CGPointMake(pointOfTouch.x*(imageSize.width/frameSize.width), pointOfTouch.y*(imageSize.height/frameSize.height));
    
    对于所有其他模式,您需要计算视图中的实际图像帧,然后使用不同的过程

    从注释添加方面匹配模式:

    对于纵横比拟合,您需要计算实际图像帧,该图像帧可以小于其中一个维度中的图像视图帧,并且位于中心:

        CGSize imageSize; // the original image size
        CGSize imageViewSize; // the image view size
    
        CGFloat imageRatio = imageSize.width/imageSize.height;
        CGFloat viewRatio = imageViewSize.width/imageViewSize.height;
    
        CGRect imageFrame = CGRectMake(.0f, .0f, imageViewSize.width, imageViewSize.height);
    
        if(imageRatio > viewRatio) {
            // image has room on top and bottom but fits perfectly on left and right
            CGSize displayedImageSize = CGSizeMake(imageViewSize.width, imageViewSize.width / imageRatio);
            imageFrame = CGRectMake(.0f, (imageViewSize.height-displayedImageSize.height)*.5f, displayedImageSize.width, displayedImageSize.height);
        }
        else if(imageRatio < viewRatio) {
            // image has room on left and right but fits perfectly on top and bottom
            CGSize displayedImageSize = CGSizeMake(imageViewSize.height * imageRatio, imageViewSize.height);
            imageFrame = CGRectMake((imageViewSize.width-displayedImageSize.width)*.5f, .0f, displayedImageSize.width, displayedImageSize.height);
        }
    
        // transform the coordinate
        CGPoint locationInImageView; // received from touch
    
        CGPoint locationOnImage = CGPointMake(locationInImageView.x, locationInImageView.y); // copy the original point
        locationOnImage = CGPointMake(locationOnImage.x - imageFrame.origin.x, locationOnImage.y - imageFrame.origin.y); // translate to fix the origin
        locationOnImage = CGPointMake(locationOnImage.x/imageFrame.size.width, locationOnImage.y/imageFrame.size.height); // transform to relative coordinates
        locationOnImage = CGPointMake(locationOnImage.x*imageSize.width, locationOnImage.y*imageSize.height); // scale to original image coordinates
    
    CGSize imageSize;//原始图像大小
    CGSize imageViewSize;//图像视图大小
    CGFloat imageRatio=imageSize.width/imageSize.height;
    CGFloat viewRatio=imageViewSize.WITH/imageViewSize.height;
    CGRect imageFrame=CGRectMake(.0f、.0f、imageViewSize.WITH、imageViewSize.height);
    如果(imageRatio>viewRatio){
    //图片的顶部和底部都有空间,但左右两侧都非常合适
    CGSize displayedImageSize=CGSizeMake(imageViewSize.width、imageViewSize.width/imageRatio);
    imageFrame=CGRectMake(.0f,(imageViewSize.height displayedImageSize.height)*.5f,displayedImageSize.width,displayedImageSize.height);
    }
    else if(图像比率<视图比率){
    //图片的左右两侧都有空间,但顶部和底部都非常合适
    CGSize displayedImageSize=CGSizeMake(imageViewSize.height*imageRatio,imageViewSize.height);
    imageFrame=CGRectMake((imageViewSize.width displayedImageSize.width)*.5f、.0f,displayedImageSize.width,displayedImageSize.height);
    }
    //变换坐标
    CGPoint locationInImageView;//从触摸屏接收
    CGPoint LOCATIONINIMAGE=CGPointMake(locationInImageView.x,locationInImageView.y);//复制原始点
    locationOnImage=CGPointMake(locationOnImage.x-imageFrame.origin.x,locationOnImage.y-imageFrame.origin.y);//转换以修复原点
    locationOnImage=CGPointMake(locationOnImage.x/imageFrame.size.width,locationOnImage.y/imageFrame.size.height);//转换为相对坐标
    locationOnImage=CGPointMake(locationOnImage.x*imageSize.width,locationOnImage.y*imageSize.height);//缩放到原始图像坐标
    

    如果您想转换为aspect fill,请注意,您需要做的就是在两个if语句中交换

    尝试我添加的代码。我没有尝试过,所以希望它能正常工作,否则请与我联系。还可以尝试在编写“fir”时编辑您的注释。请尝试我添加的代码。我没有尝试,所以我希望它能正常工作,否则会回复我。也请尝试在编写“fir”时编辑您的评论。我面临同样的问题。我需要UIImagePoint从UIImageViewPoint获得UIImagePoint。您能解决它吗?@MikeAlter这是很久以前的事了。Bu