我正在使用UIImages将UIBezierPath裁剪为UIGraphicsContext:
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越大。我确信在我做这些操作之前,originalImages是非常好的(我已经检查过了)
我的图像都是9:16 (假设72 if宽128 if高),如果这很重要的话。
我看到UIGraphics用"ARGB 32位整数像素格式使用主机字节顺序“创建了一个位图;当涉及像素格式时,我会承认有一点无知,但我觉得这可能是相关的,因为我不确定这是否与我用来编码图片数据的像素格式相同。
不知道这有多重要,但下面是完整的处理管道:我使用AVFoundation捕获,并将photoSettings设置为
NSDictionary *photoSettings = @{AVVideoCodecKey : AVVideoCodecH264};使用captureStillImageAsynchronouslyFromConnection:..捕获,然后使用[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];将其转换为NSData,然后通过创建CGDataProviderRefWithCFData并使用CGImageSourceCreateThumbnailAtIndex转换为CGImageRef并从中获取UIImage,从而缩小到缩略图。
稍后,我再次使用NSData将其转换为UIImageJPEGRepresentation(thumbnail, 0.7),以便存储。最后,当我准备好显示时,我会在[self maskImage:[UIImage imageWithData:imageData] toPath:_thumbnailPath]顶部调用自己的方法,并将其显示在UIImageView上,并设置contentMode = UIViewContentModeScaleAspectFit。
如果我用UIBezierPath掩蔽UIBezierPath的方法很好,我可能最终会显式地用[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil]设置photoOutput设置,并且I可能会使用类似于如何将CVImageBufferRef转换为UIImage的东西,并更改大量代码.但我真的不想那么做,除非完全必要,因为,正如我所提到的,我真的不太了解视频编码/所有这些图形化的、低级别的对象。
发布于 2015-08-15 22:09:00
这一行:
[originalImage drawInRect:CGRectMake(0, originalImage.size.height/-3, thumbnailSize.width, originalImage.size.height)];是个问题。您正在绘制originalImage,但您指定了thumbnailSize.width的宽度和originalImage的高度。这会扰乱图像的纵横比。
您需要基于相同图像大小的宽度和高度。根据需要选择一个,以保持适当的纵横比。
https://stackoverflow.com/questions/32029840
复制相似问题