場景
通過視頻流識別范圍內的圖片胡诗。
問題
把像 素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;
}