OC 视频流图片剪切

2021-11-18  本文已影响0人  Jniying

场景

通过视频流识别范围内的图片。

问题

把像 素rect 转化为 点rect,我们通常以屏幕像素比例转化 错误示范 代码如下:
结果:图片剪切的范围获取不准确。

/*
image : 要进行剪切的图片
rect:要剪切的图片范围
*/
- (UIImage *)ct_imageFromImage:(UIImage *)image inRect:(CGRect)rect{
    //获取正确方向的图片
    UIImage *tempImage = [self fixOrientation:image];

    //把像 素rect 转化为 点rect(如无转化则按原图像素取部分图片)
    CGFloat scale = [UIScreen mainScreen].scale;
    CGFloat x= rect.origin.x*scale,y=rect.origin.y*scale,w=rect.size.width*scale,h=rect.size.height*scale;
    CGRect dianRect = CGRectMake(x, y, w, h);
    
    //截取部分图片并生成新图片
    
    CGImageRef sourceImageRef = [tempImage CGImage];
    
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, dianRect);
    
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    
    return newImage;
    
}

解决方案代码

重点: 把像 素rect 转化为 点rect 的时候要以图片大小对比屏幕作为参考物。

不能单纯以屏幕像素点作为参考物,实际视频流获取的图片比屏幕显示的可能要大或者小。

/*
image : 要进行剪切的图片
rect:要剪切的图片范围
*/
- (UIImage *)ct_imageFromImage:(UIImage *)image inRect:(CGRect)rect{
    //获取正确方向的图片
    UIImage *tempImage = [self fixOrientation:image];

    //把像 素rect 转化为 点rect(如无转化则按原图像素取部分图片)
    CGFloat wScale = tempImage.size.width / zhcScreenWidth;
    CGFloat hScale = tempImage.size.height / zhcScreenHeight;
    CGFloat x= rect.origin.x*wScale,y=rect.origin.y*hScale,w=rect.size.width*wScale,h=rect.size.height*hScale;
    CGRect dianRect = CGRectMake(x, y, w, h);
    
    //截取部分图片并生成新图片
    
    CGImageRef sourceImageRef = [tempImage CGImage];
    
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, dianRect);
    
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    
    return newImage;
    
}
上一篇 下一篇

猜你喜欢

热点阅读