私は一日中これに取り組んでいて、ここSOとグーグルでたくさんの質問を見てきました、しかし今のところ私は完全に正しいものを思い付くことができません。
iOS 5.1.1を実行しているiPadで写真を撮り、Photosアプリを使用してトリミングしました。次に、アセットライブラリから参照を取得し、トリミングされていないフル解像度の画像を取得しています。
トリミング情報がオブジェクトのの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
で完璧に表示されますが、フルサイズの画像が必要です。