使用GPUImageTransformFilter进行错误缩放

时间:2014-01-29 11:40:43

标签: ios objective-c gpuimage

我尝试使用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缩放。我做错了什么?

1 个答案:

答案 0 :(得分:4)

如果您要做的是对给定图像进行下采样,我将不会使用上述方法。相反,我建议您为过滤器使用GPUImageLanczosResamplingFilter并在其上调用-forceProcessingAtSize:-forceProcessingAtSizeRespectingAspectRatio:。强制处理大小的方法是调整滤镜图像的像素尺寸大小,以及Lanczos重新取样gives you much higher quality results

变换滤镜会在原始像素大小内变换图像,因此它可以缩小或定位整个场景中的图像,但它不是用于调整图像整体尺寸的图像。您从上面得到的图像的最终像素大小是您最初输入此过程的UIImage的初始像素大小。

至于为什么它是你期望的两倍,我猜测这与视网膜显示器的点数与像素差异有关。您可能正在以点为单位检查UIKit元素的大小,并从中创建UIImage。 UIImage的实际像素尺寸是两个尺寸中点尺寸的2倍。

同样,使用-forceProcessingAtSize:会将输出的确切像素尺寸设置为您想要的值。