2014-06-02 3 views
0

Xcode 5, IOS 7Как сделать CGImageCreateWithImageInRect ссылкой преобразованное изображение?

Я загрузка изображения в UIImage, а затем скопировать его в другую UIImage с зеркалом преобразования, а именно:

self.imageB.image=[UIImage imageWithCGImage:[self.imageA.image CGImage] scale:1.0 orientation:UIImageOrientationUpMirrored]; 

Далее, я пытаюсь объединить два изображений в одно при сохранении (originalImage относится к загруженному изображению до копирования/преобразования в imageA и imageB):

newSize=CGSizeMake(originalImage.size.width*2,originalImage.size.height); 
UIGraphicsBeginImageContext(newSize); 
UIImage *leftImage=self.imageA.image; 
UIImage *rightImage=self.imageB.image; 
[self.imageA.image drawInRect:CGRectMake(0,0,newSize.width/2,newSize.height)]; 
[self.imageB.image drawInRect:CGRectMake(newSize.width/2,0,newSize.width/2,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0]; 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil); 

Это работает и дает мне один сохраненное зеркальное изображение. Тем не менее, я пытаюсь сделать это, используя только субрегион mageA и imageB, , и результатом является то, что часть из изображения B теряет зеркальное преобразование. я в конечном итоге с обеих сторон окончательного, имеющего такой же ориентации! (Примечание: visRatio процент изображения я хочу сохранить)

newSize=CGSizeMake(originalImage.size.width*2,originalImage.size.height); 
UIGraphicsBeginImageContext(newSize); 
UIImage *leftImage=self.imageA.image; 
UIImage *rightImage=self.imageB.image; 

CGRect clippedRectA = CGRectMake(0,0,originalImage.size.width*visRatio,originalImage.size.height); 
CGImageRef imageRefA = CGImageCreateWithImageInRect([self.imageA.image CGImage], clippedRectA); 
UIImage *leftImageA = [UIImage imageWithCGImage:imageRefA]; 
[leftImageA drawInRect:CGRectMake(0,0,newSize.width/2,newSize.height)]; 

CGRect clippedRectB = CGRectMake(originalImage.size.width-(originalImage.size.width*visRatio),0,originalImage.size.width*visRatio,originalImage.size.height); 
CGImageRef imageRefB = CGImageCreateWithImageInRect([self.imageB.image CGImage], clippedRectB); 
UIImage *rightImageB = [UIImage imageWithCGImage:imageRefB]; 
[rightImageB drawInRect:CGRectMake(newSize.width/2,0,newSize.width/2,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil); 

Это как бы копии «CGImageCreateWithImageInRect» изображение от оригинала, а не преобразованные данные. Как я могу выполнить это без потери зеркальных преобразований imageB?

ответ

0

я понял это - это будет использовать оригинал, открыли данные с полным разрешением в originalImage и сохранили подрезанный, преобразованная версия (я оставил зеркалирование из этого поста для простоты):

//capture the transformed version 
    CGSize tmpSize=CGSizeMake(originalImage.size.width, originalImage.size.height); 
    UIGraphicsBeginImageContext(tmpSize); 
    [self.imageA.image drawInRect:CGRectMake(0,0, tmpSize.width, tmpSize.height)]; 
    UIImage *tmpImageA=UIGraphicsGetImageFromCurrentImageContext(); 
    visRatio=0.5; 
    //clip it 
    clippedRectA=CGRectMake(0,0,roundf(originalImage.size.width*visRatio),originalImage.size.height); 
    imageRefA=CGImageCreateWithImageInRect([tmpImageA CGImage],clippedRectA); 
    leftImageA=[UIImage imageWithCGImage:imageRefA]; 
    UIGraphicsEndImageContext(); 

    savedImage=UIGraphicsGetImageFromCurrentImageContext(); 
    UIImageWriteToSavedPhotosAlbum(savedImage, nil, nil, nil); 

Я считаю, ключ состоит в том, чтобы нарисовать изображение в контексте, а затем использовать контекст для обрезки/сохранения вместо основного изображения (imageA). Если вы найдете более эффективный способ, отправьте его! В противном случае я надеюсь, что это поможет кому-то еще ....

Смежные вопросы