Я работаю над этим весь день и просмотрел множество вопросов здесь, на SO и в Google, но пока не могу придумать ничего правильного.
Я сделал фотографию на iPad под управлением iOS 5.1.1 и обрезал ее с помощью приложения «Фотографии». Затем я получаю ссылку на него из библиотеки активов и получаю необрезанное изображение с полным разрешением.
Я обнаружил, что информация об обрезке содержится в ключе AdjustmentXMP
элемента metadata
моего объекта ALAssetRepresentation
.
Поэтому я обрезаю фотографию, используя информацию XMP, и вот что я получаю:
Исходное фото (1936 x 2592):
Правильно обрезанное фото в приложении «Фото» (1420 x 1938):
Фотография обрезана с кодом ниже
(тоже 1420 x 1938, но обрезано примерно на 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
, он отображается отлично, но мне нужно полноразмерное изображение.
fullResolutionImage
? А что такое[rep scale]
и[rep orientation]
? (Я подозреваю, что StackOverflow изменил размер ваших изображений, но это невозможно знать наверняка.) - person Kurt Revis   schedule 30.12.2012fullResolutionImage
— это первое фото.scale
равно 1,0, аorientation
равно 3. Однако рамка кадрирования должна применяться к неповернутому изображению. - person lnafziger   schedule 30.12.2012