我尝试使用GPUImage将图像蒙版的大小调整为给定图像的大小
-(void)imageTaken:(UIImage *)image
{
[super imageTaken:image];
CGFloat sx = image.size.width / self.imageMask.size.width;
CGFloat sy = image.size.height / self.imageMask.size.height;
GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init];
CATransform3D t3d = CATransform3DMakeScale(sx, sy, 1);
scaleFilter.transform3D = t3d;
GPUImagePicture *scaleImageSource = [[GPUImagePicture alloc] initWithImage:self.imageMask];
[scaleImageSource addTarget:scaleFilter];
[scaleImageSource processImage];
UIImage *scaledMaskImage = [scaleFilter imageFromCurrentlyProcessedOutput] ;
NSLog(@" sx: %f, sy : %f", sx,sy);
NSLog(@"[image size] : %@", NSStringFromCGSize([image size]));
NSLog(@"[_imageMask size] : %@", NSStringFromCGSize([_imageMask size]));
NSLog(@"[scaledMaskImage size] : %@", NSStringFromCGSize([scaledMaskImage size]));
[self.delegate photo:image
imageMask:scaledMaskImage takenOnPhotoMaskViewController:self];
}
输出:
sx: 1.500000, sy : 1.126761
[image size] : {480, 640}
[_imageMask size] : {320, 568}
[scaledMaskImage size] : {640, 1136}
根据我的理解[scaledMaskImage size]
应该是{480, 640}
,因为sx是1.5而sy是1.126761,但是因为它是{640, 1136}
,所以它按2.0缩放。我做错了什么?
答案 0 :(得分:4)
如果您要做的是对给定图像进行下采样,我将不会使用上述方法。相反,我建议您为过滤器使用GPUImageLanczosResamplingFilter并在其上调用-forceProcessingAtSize:
或-forceProcessingAtSizeRespectingAspectRatio:
。强制处理大小的方法是调整滤镜图像的像素尺寸大小,以及Lanczos重新取样gives you much higher quality results。
变换滤镜会在原始像素大小内变换图像,因此它可以缩小或定位整个场景中的图像,但它不是用于调整图像整体尺寸的图像。您从上面得到的图像的最终像素大小是您最初输入此过程的UIImage的初始像素大小。
至于为什么它是你期望的两倍,我猜测这与视网膜显示器的点数与像素差异有关。您可能正在以点为单位检查UIKit元素的大小,并从中创建UIImage。 UIImage的实际像素尺寸是两个尺寸中点尺寸的2倍。
同样,使用-forceProcessingAtSize:
会将输出的确切像素尺寸设置为您想要的值。