具有较大文件(像素格式、编解码器?)的 UIGraphicsBeginImageContext 的 UIImage 失真

UIImage Distortion from UIGraphicsBeginImageContext with larger files (pixel formats, codecs?)

我正在使用 UIGraphicsContext 使用 UIBezierPath 裁剪 UIImages:

CGSize thumbnailSize = CGSizeMake(54.0f, 45.0f); // dimensions of UIBezierPath
UIGraphicsBeginImageContextWithOptions(thumbnailSize, NO, 0);
[path addClip];
[originalImage drawInRect:CGRectMake(0, originalImage.size.height/-3, thumbnailSize.width, originalImage.size.height)];
UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

但是由于某种原因,我的图像在垂直方向上被拉伸了(所有东西看起来都有些细长),而且 originalImage 越大,这种效果就越强。在执行这些操作之前,我确定原始图像完全没问题(我已经检查过了)

如果重要的话,我的图片都是 9:16(比如 72px 宽 x 128px 高)。

我见过 UIGraphics 使用 "ARGB 32-bit integer pixel format using host-byte order"; 创建位图我承认在像素格式方面有点无知,但我觉得这可能是相关的,因为我不确定这是否与我用来编码图片数据的像素格式相同。

不知道这有多相关,但这是完整的处理管道: 我正在使用 AVFoundation 进行捕获,并将我的 photoSettings 设置为

NSDictionary *photoSettings = @{AVVideoCodecKey : AVVideoCodecH264};

使用 captureStillImageAsynchronouslyFromConnection:.. 捕获然后使用 [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 将其转换为 NSData 然后通过创建 CGDataProviderRefWithCFData 缩小为缩略图并使用 CGImageSourceCreateThumbnailAtIndex 转换为 CGImageRef 和从中获取 UIImage。

后来,我再次使用 UIImageJPEGRepresentation(thumbnail, 0.7) 将其转换为 NSData,以便存储。最后,当我准备好显示时,我调用顶部 [self maskImage:[UIImage imageWithData:imageData] toPath:_thumbnailPath] 中详述的我自己的方法并将其显示在 UIImageView 上并设置 contentMode = UIViewContentModeScaleAspectFit.

如果我用 UIBezierPath 屏蔽 UIImage 的方法没问题,我最终可能会使用 [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil] 显式设置 photoOutput 设置,我可能会使用类似 how to convert a CVImageBufferRef to UIImage 的方法并更改我的很多代码......但我真的宁愿不这样做,除非完全必要,因为正如我所提到的,我真的不太了解视频编码/所有这些图形化的低级对象。

这一行:

[originalImage drawInRect:CGRectMake(0, originalImage.size.height/-3, thumbnailSize.width, originalImage.size.height)];

是个问题。您正在绘制 originalImage,但指定了 thumbnailSize.width 的宽度和 originalImage 的高度。这弄乱了图像的纵横比。

您需要基于相同图片尺寸的宽度和高度。根据需要选择一个以保持适当的纵横比。