2009-04-07 8 views
8

अद्यतन अधिकतम आकार करने के लिए:UIImagePickerController संपादन अनुमति ताले UIImage की 320x320

iPhone OS 3.0+ के साथ

, पूरे UIImagePickerController एपीआई बदल गया है। यह प्रश्न और उत्तर 2.2 माना जाना चाहिए। लीगेसी कोड।


UIImagePickerController का उपयोग करने और आप छवि का संपादन की अनुमति देते हैं। आईफोन उपयोगकर्ता को छवि का आकार बदलने और पैन करने की अनुमति देता है। हालांकि, एक संपादित छवि का अधिकतम आकार 320x320 पर कैप्ड किया गया है।

उदाहरण के तौर पर, मैंने एक आईफोन स्क्रीनशॉट लिया और इसे फोटो लाइब्रेरी में रखा, जो कि 480x320 पीएनजी है। जब मैं उस छवि का चयन करने के लिए UIImagePickerController का उपयोग करता हूं, भले ही मैं छवि को स्केल या पैन न करें, फिर भी यह UIImagePickerController से वापस आने से पहले 320x320 तक पहुंच गया है। हालांकि, अगर मैं संपादन बंद कर देता हूं, तो छवि उचित 480x320 आकार लौटा दी जाती है।

मेरा सिद्धांत: बहुत संक्षेप में, आईफोन 2 गैर-मानक पारदर्शी टूल बार प्रदर्शित करता है जो छवि पर ओवरले करते हैं। ये टूलबार फोटो पर एक निर्दोष 320x320 "विंडो" छोड़ते हैं। मुझे लगता है कि यह खिड़की प्रभावी रूप से अंतर्निहित तस्वीर को क्लिप करती है।

नोट: कॉलबैक मूल छवि और क्लिपिंग रेक्ट के साथ एक संपादन शब्दकोश भी देता है, लेकिन निश्चित रूप से रेक्ट भी अधिकतम 320x320 है।

320x320 से बड़ी छवियों को स्केल और पैन करने की अनुमति देने के तरीके पर कोई विचार?

कुछ कोड:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo { 

     self.myImageView.userInteractionEnabled=YES; 
     CGRect imageFrame = myImageView.frame; 
     CGPoint imageCenter = myImageView.center; 
     imageFrame.size = img.size; 
     myImageView.frame = imageFrame; 
     self.myImageView.image = img; 
     myImageView.center = imageCenter; 

     [self dismissModalViewControllerAnimated:YES]; 
     [self performSelector:@selector(hideToolBars) withObject:nil afterDelay:2.0]; 
    } 
+0

मैं अभी भी 3.0.1 पर यह समस्या देख रहा हूं, क्या यह 3.1 में तय है? – Jasarien

उत्तर

7

के रूप में क्रेग ने कहा, इस देव मंचों और सेब नियमित रूप से चर्चा बोर्ड में एक मुद्दा है। हालांकि, मैंने इसके आसपास एक रास्ता खोजा। मैं से कोड का एक सा प्रयोग कर रहा हूँ:

Apple Dev Forums

यह तुम क्या जरूरत के सबसे शामिल है, और सभी कैमरा उन्मुखीकरण मुद्दों का ख्याल रखता है। निम्नलिखित के लिए पोस्ट

- (UIImage*)scaleImage:(UIImage*)anImage withEditingInfo:(NSDictionary*)editInfo{ 

    UIImage *newImage; 

    UIImage *originalImage = [editInfo valueForKey:@"UIImagePickerControllerOriginalImage"]; 
    CGSize originalSize = CGSizeMake(originalImage.size.width, originalImage.size.height); 
    CGRect originalFrame; 
    originalFrame.origin = CGPointMake(0,0); 
    originalFrame.size = originalSize; 

    CGRect croppingRect = [[editInfo valueForKey:@"UIImagePickerControllerCropRect"] CGRectValue]; 
    CGSize croppingRectSize = CGSizeMake(croppingRect.size.width, croppingRect.size.height); 

    CGSize croppedScaledImageSize = anImage.size; 

    float scaledBarClipHeight = 80; 

    CGSize scaledImageSize; 
    float scale; 

    if(!CGSizeEqualToSize(croppedScaledImageSize, originalSize)){ 

     scale = croppedScaledImageSize.width/croppingRectSize.width; 
     float barClipHeight = scaledBarClipHeight/scale; 

     croppingRect.origin.y -= barClipHeight; 
     croppingRect.size.height += (2*barClipHeight); 

     if(croppingRect.origin.y<=0){ 
      croppingRect.size.height += croppingRect.origin.y; 
      croppingRect.origin.y=0; 
     } 

     if(croppingRect.size.height > (originalSize.height - croppingRect.origin.y)){ 
      croppingRect.size.height = (originalSize.height - croppingRect.origin.y); 
     } 


     scaledImageSize = croppingRect.size; 
     scaledImageSize.width *= scale; 
     scaledImageSize.height *= scale; 

     newImage = [self cropImage:originalImage to:croppingRect andScaleTo:scaledImageSize]; 

    }else{ 

     newImage = originalImage; 

    } 

    return newImage; 
} 

मैं देव मंचों से कॉल बैक विधि अपडेट:: मैं जिसके बाद संपादन की जानकारी में लेगी और उसका उपयोग इस के अलावा के साथ मूल फसल रेक्ट पाने के लिए होगा जोड़ दिया है

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo { 

    [self dismissModalViewControllerAnimated:YES]; 
    self.myImageView.userInteractionEnabled=YES; 
    CGRect imageFrame = myImageView.frame; 
    CGPoint imageCenter = myImageView.center; 
    UIImage *croppedImage; 


    NSMutableDictionary *imageDescriptor = [editInfo mutableCopy]; 

    // CGFloat scaleSize = 400.0f; 
    CGFloat scaleSize = 640.0f; 
    switch ([picker sourceType]) { 
      //done 
     case UIImagePickerControllerSourceTypePhotoLibrary: 
      croppedImage = [self scaleImage:img withEditingInfo:editInfo]; 
      [imageDescriptor setObject:croppedImage forKey:@"croppedImage"]; 
      break; 


     case UIImagePickerControllerSourceTypeCamera: { 
      UIImageOrientation originalOrientation = [[editInfo objectForKey:UIImagePickerControllerOriginalImage] imageOrientation]; 
      if (originalOrientation != UIImageOrientationUp) { 
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
       CGRect origRect; 
       [[editInfo objectForKey:UIImagePickerControllerCropRect] getValue:&origRect]; 
       UIImage *rotatedImage = straightenAndScaleImage([editInfo objectForKey:UIImagePickerControllerOriginalImage], scaleSize); 
       CGFloat scale = scaleSize/1600.0f; 
       origRect.origin.x *= scale; 
       origRect.origin.y *= scale; 
       origRect.size.width *= scale; 
       origRect.size.height *= scale; 
       croppedImage = [self cropImage:rotatedImage to:origRect andScaleTo:CGSizeMake(320, 480)]; 
       [imageDescriptor setObject:croppedImage forKey:@"croppedImage"]; 
       [pool drain]; 
      } 
      else { 
       croppedImage = [self scaleImage:img withEditingInfo:editInfo]; 
       [imageDescriptor setObject:croppedImage forKey:@"croppedImage"]; 
      } 
     } 
      break; 

     case UIImagePickerControllerSourceTypeSavedPhotosAlbum: { 
      UIImageOrientation originalOrientation = [[editInfo objectForKey:UIImagePickerControllerOriginalImage] imageOrientation]; 
      if (originalOrientation != UIImageOrientationUp) { 
       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
       CGRect origRect; 
       [[editInfo objectForKey:UIImagePickerControllerCropRect] getValue:&origRect]; 
       UIImage *rotatedImage = straightenAndScaleImage([editInfo objectForKey:UIImagePickerControllerOriginalImage], scaleSize); 
       CGFloat scale = scaleSize/640.0f; 
       origRect.origin.x *= scale; 
       origRect.origin.y *= scale; 
       origRect.size.width *= scale; 
       origRect.size.height *= scale; 
       croppedImage = [self cropImage:rotatedImage to:origRect andScaleTo:CGSizeMake(320, 480)]; 
       [imageDescriptor setObject:croppedImage forKey:@"croppedImage"]; 
       [pool drain]; 
      } 
      else { 
       croppedImage = [self scaleImage:img withEditingInfo:editInfo]; 
       [imageDescriptor setObject:croppedImage forKey:@"croppedImage"]; 
      } 
     } 
      break; 
     default: 
      break; 
    } 

    imageFrame.size = croppedImage.size; 
    myImageView.frame = imageFrame; 
    myImageView.image = [imageDescriptor objectForKey:@"croppedImage"]; 
    myImageView.center = imageCenter; 


} 
+0

करने के बजाय: CGSize originalSize = CGSizeMake (originalImage.size.width, originalImage.size.height); आप बस CGSize originalSize = originalImage.size.width कर सकते हैं; –

+0

@ फ्रैंक - मुझे लगता है कि आपका मतलब है कि आप केवल CGSize originalSize = originalImage.size कर सकते हैं; – Brian

+0

@ ब्रायन - हाँ, यही मेरा मतलब था। यकीन नहीं है कि कैसे .width वहाँ मिला। 3 साल की गलती लेने के लिए आपको कुछ प्रकार का बैज मिलना चाहिए! –

1

यह कम से कम चित्र पिकर पर सही पर allowsImageEditing सेट करते समय, एसडीके के एक बाधा प्रतीत होता है। एप्पल मंचों यहाँ में इस विषय पर चर्चा का एक सा नहीं है:

http://discussions.apple.com/message.jspa?messageID=7841993

1

देर आए दुरुस्त आए: यहाँ orientationTransformForImage समारोह के लिए स्रोत है

 

CGAffineTransform orientationTransformForImage(UIImage *image, CGSize *newSize) { 
    CGImageRef img = [image CGImage]; 
    CGFloat width = CGImageGetWidth(img); 
    CGFloat height = CGImageGetHeight(img); 
    CGSize size = CGSizeMake(width, height); 
    CGAffineTransform transform = CGAffineTransformIdentity; 
    CGFloat origHeight = size.height; 
    UIImageOrientation orient = image.imageOrientation; 
    switch(orient) { /* EXIF 1 to 8 */ 
     case UIImageOrientationUp: 
      break; 
     case UIImageOrientationUpMirrored: 
      transform = CGAffineTransformMakeTranslation(width, 0.0f); 
      transform = CGAffineTransformScale(transform, -1.0f, 1.0f); 
      break; 
     case UIImageOrientationDown: 
      transform = CGAffineTransformMakeTranslation(width, height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformMakeTranslation(0.0f, height); 
      transform = CGAffineTransformScale(transform, 1.0f, -1.0f); 
      break; 
     case UIImageOrientationLeftMirrored: 
      size.height = size.width; 
      size.width = origHeight; 
      transform = CGAffineTransformMakeTranslation(height, width); 
      transform = CGAffineTransformScale(transform, -1.0f, 1.0f); 
      transform = CGAffineTransformRotate(transform, 3.0f * M_PI/2.0f); 
      break; 
     case UIImageOrientationLeft: 
      size.height = size.width; 
      size.width = origHeight; 
      transform = CGAffineTransformMakeTranslation(0.0f, width); 
      transform = CGAffineTransformRotate(transform, 3.0f * M_PI/2.0f); 
      break; 
     case UIImageOrientationRightMirrored: 
      size.height = size.width; 
      size.width = origHeight; 
      transform = CGAffineTransformMakeScale(-1.0f, 1.0f); 
      transform = CGAffineTransformRotate(transform, M_PI/2.0f); 
      break; 
     case UIImageOrientationRight: 
      size.height = size.width; 
      size.width = origHeight; 
      transform = CGAffineTransformMakeTranslation(height, 0.0f); 
      transform = CGAffineTransformRotate(transform, M_PI/2.0f); 
      break; 
     default: 
      ; 
    } 
    *newSize = size; 
    return transform; 
} 
5

मैं इस सवाल का जवाब देने के लिए बहुत देर हो चुकी होना चाहिए, लेकिन मैं एक बेहतर तरीका टी मिल गया है ओ यह काम पूरा हो जाओ।

static inline double radians (double degrees) {return degrees * M_PI/180;} 

+(UIImage*)editedImageFromMediaWithInfo:(NSDictionary*)info{ 
    if(![info objectForKey:UIImagePickerControllerCropRect])return nil; 
    if(![info objectForKey:UIImagePickerControllerOriginalImage])return nil; 

    UIImage *originalImage=[info objectForKey:UIImagePickerControllerOriginalImage]; 
    CGRect rect=[[info objectForKey:UIImagePickerControllerCropRect] CGRectValue]; 

    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], rect); 

    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); 
    CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); 

    if (originalImage.imageOrientation == UIImageOrientationLeft) { 
     CGContextRotateCTM (bitmap, radians(90)); 
     CGContextTranslateCTM (bitmap, 0, -rect.size.height); 

    } else if (originalImage.imageOrientation == UIImageOrientationRight) { 
     CGContextRotateCTM (bitmap, radians(-90)); 
     CGContextTranslateCTM (bitmap, -rect.size.width, 0); 

    } else if (originalImage.imageOrientation == UIImageOrientationUp) { 
     // NOTHING 
    } else if (originalImage.imageOrientation == UIImageOrientationDown) { 
     CGContextTranslateCTM (bitmap, rect.size.width, rect.size.height); 
     CGContextRotateCTM (bitmap, radians(-180.)); 
    } 

    CGContextDrawImage(bitmap, CGRectMake(0, 0, rect.size.width, rect.size.height), imageRef); 
    CGImageRef ref = CGBitmapContextCreateImage(bitmap); 

    UIImage *resultImage=[UIImage imageWithCGImage:ref]; 
    CGImageRelease(imageRef); 
    CGContextRelease(bitmap); 
    CGImageRelease(ref); 

    return resultImage; 
} 

यह केवल रिश्तेदार CropRect, , हालांकि इस पद्धति dosen't पैमाने छवि के साथ मूल छवि फसलों, लेकिन यह कम है और मेरे लिए मीठा होता है। बस संदर्भ :)

2

iPhone OS के साथ 3.0+ के लिए, पूरे UIImagePickerController एपीआई बदल गया है। यह प्रश्न और उत्तर को 2.2 माना जाना चाहिए। लीगेसी कोड।

अपने चेतावनी के बावजूद, यह मुझे एक कीमती देव घंटे लग गए आईओएस 3.0+ हमें UIImagePickerControllerEditedImage जो मैन्युअल रूप से उपयोगकर्ता की चुटकी/ज़ूम करने के लिए फसल और अभिविन्यास अनावश्यक के साथ काम कर के साथ काम करता है दे दी है महसूस करने के लिए।

यह किसी भी मामले में अभी भी UIImagePickerControllerOriginalImage का उपयोग कर रहा था और यह पता लगाने की कोशिश कर रहा है कि UIImagePickerControllerCropRect, आदि के माध्यम से क्रॉपिंग को सर्वोत्तम तरीके से कैसे लागू किया जाए। अब और आवश्यकता नहीं है।

0

मैंने category on UIImage लिखा जो एक पूर्ण-रिज़ॉल्यूशन फसल प्रदान करता है। स्थापित करने का सबसे आसान तरीका CocoaPods के साथ है, जो आपके पॉडफ़ाइल पर UIImage-ImagePickerCrop जोड़कर है।

#import <UIImage+ImagePickerCrop.h> 

... 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info { 
    [self dismissViewControllerAnimated:YES completion:nil]; 

    UIImage *croppedImage = [UIImage croppedImageWithImagePickerInfo:info]; 
    ... 
} 
संबंधित मुद्दे