我整天都在研究这个问题,并且在 SO 和 google 上查看了很多问题,但到目前为止我还没有想出任何正确的答案。
我在运行 iOS 5.1.1 的 iPad 上拍摄了一张照片,并使用照片应用对其进行了裁剪。然后我从资产库中获得对它的引用,并获得未裁剪的全分辨率图像。
我发现裁剪信息包含在我的对象的AdjustmentXMP
键中。metadata
ALAssetRepresentation
所以我使用 XMP 信息裁剪照片,这是我得到的:
原始照片(1,936 x 2,592):
正确裁剪的照片,如照片应用程序中所示 (1,420 x 1,938):
用下面的代码裁剪的照片
(也是 1,420 x 1,938,但裁剪得离右边太远了大约 200 像素):
这是照片中的 XMP 数据:
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:aas="http://ns.apple.com/adjustment-settings/1.0/">
<aas:AffineA>1</aas:AffineA>
<aas:AffineB>0</aas:AffineB>
<aas:AffineC>0</aas:AffineC>
<aas:AffineD>1</aas:AffineD>
<aas:AffineX>-331</aas:AffineX>
<aas:AffineY>-161</aas:AffineY>
<aas:CropX>0</aas:CropX>
<aas:CropY>0</aas:CropY>
<aas:CropW>1938</aas:CropW>
<aas:CropH>1420</aas:CropH>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
这是我用来裁剪照片的代码:
ALAssetRepresentation *rep = // Get asset representation
CGImageRef defaultImage = [rep fullResolutionImage];
// Values obtained from XMP data above:
CGRect cropBox = CGRectMake(0, 0, 1938, 1420);
CGAffineTransform transform = CGAffineTransformMake(1, 0, 0, 1, 331, 161);
// Apply the Affine Transform to the crop box:
CGRect transformedCropBox = CGRectApplyAffineTransform(cropBox, transform);
// Created a new cropped image:
CGImageRef croppedImage = CGImageCreateWithImageInRect(defaultImage, transformedCropBox);
// Create the UIImage:
UIImage *image = [UIImage imageWithCGImage:croppedImage scale:[rep scale] orientation:[rep orientation]];
CGImageRelease(croppedImage);
我用多张图片重现了这个问题。如果我只是使用fullScreenImage
它可以完美显示,但我需要全尺寸图像。