场景
通过视频流识别范围内的图片。
问题
把像 素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;
}