2012-08-25 6 views
0

Comment redimensionner une image avec une qualité goo. J'utilise ce code suivant mais quand je prends en utilisant l'image de l'appareil photo son affichage dans un cadre différent.Comment redimensionner une image?

-(UIImage *)resizeImage:(UIImage *)image { 
int w = image.size.width; 
int h = image.size.height; 

CGImageRef imageRef = [image CGImage]; 

int width, height; 

int destWidth = 640; 
int destHeight = 480; 
if(w > h){ 
    width = destWidth; 
    height = h*destWidth/w; 
} else { 
    height = destHeight; 
    width = w*destHeight/h; 
} 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef bitmap; 
bitmap = CGBitmapContextCreate(NULL, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedFirst); 

if (image.imageOrientation == UIImageOrientationLeft) { 
    CGContextRotateCTM (bitmap, M_PI/2); 
    CGContextTranslateCTM (bitmap, 0, -height); 

} else if (image.imageOrientation == UIImageOrientationRight) { 
    CGContextRotateCTM (bitmap, -M_PI/2); 
    CGContextTranslateCTM (bitmap, -width, 0); 

} else if (image.imageOrientation == UIImageOrientationUp) { 

} else if (image.imageOrientation == UIImageOrientationDown) { 
    CGContextTranslateCTM (bitmap, width,height); 
    CGContextRotateCTM (bitmap, -M_PI); 

} 

CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef); 
CGImageRef ref = CGBitmapContextCreateImage(bitmap); 
UIImage *result = [UIImage imageWithCGImage:ref]; 

CGContextRelease(bitmap); 
CGImageRelease(ref); 

return result; 
} 

S'il y a de toute façon de réduire la taille sans affecter la qualité s'il vous plaît suggérer Merci à l'avance

Répondre

0

Afin de réduire la taille, vous devrez faire des compromis sur la résolution de l'image. Je vous suggère de calculer une nouvelle largeur et une nouvelle hauteur pour l'image.

Voici quelque chose qui a fonctionné pour moi:

Essayez ceci:

-(UIImage*) resizeImage:(CGImageRef)image toWidth:(int)width andHeight:(int)height 
{ 
// create context, keeping original image properties 
    CGColorSpaceRef colorspace = CGImageGetColorSpace(image); 
    CGContextRef context = CGBitmapContextCreate(NULL, width, height,             CGImageGetBitsPerComponent(image),           CGImageGetBytesPerRow(image), 
              colorspace, 
              CGImageGetAlphaInfo(image)); 

     if(context == NULL) 
     { 
     NSLog(@"Could not re-size"); 
     return nil; 
     } 
     // draw image to context (resizing it) 
     CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); 
     // extract resulting image from context 
     CGImageRef imgRef = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 
     UIImage* resizedImage = [UIImage imageWithCGImage:imgRef]; 
     CGImageRelease(imgRef); 
     return resizedImage; 
} 
+0

Notez que cela ne fonctionnerait pas si l'information alpha n'est pas supportée ou si d'autres informations sont nécessaires. Vous devez masquer les bits alpha, puis le définir sur kCGImageAlphaPremultipliedFirst. – Nuoji

0

J'ai utilisé le code ci-dessous pour échelle l'image pour l'image de la caméra. Veuillez implémenter si vous avez trouvé l'aide complète

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

//// ADDIGN THIS LINE WHEN YOU CAPTURED IMAGE 

    image = [self scaleAndRotateImage:image]; 
    [self useImage:image]; 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
} 

/// THE METHODS ROTATE THE CURRENT CAPTURED IMAGE AT 90 DEGREE OF ANGLE 

- (void)scaleAndRotateImage:(UIImage *)image 
{ 
    int kMaxResolution = 320; // Or whatever 

    CGImageRef imgRef = image.CGImage; 

    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 

    CGAffineTransform transform = CGAffineTransformIdentity; 
    CGRect bounds = CGRectMake(0, 0, width, height); 
    if (width > kMaxResolution || height > kMaxResolution) { 
     CGFloat ratio = width/height; 
     if (ratio > 1) { 
      bounds.size.width = kMaxResolution; 
      bounds.size.height = bounds.size.width/ratio; 
     } 
     else { 
      bounds.size.height = kMaxResolution; 
      bounds.size.width = bounds.size.height * ratio; 
     } 
    } 

    CGFloat scaleRatio = bounds.size.width/width; 
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
    CGFloat boundHeight; 
    UIImageOrientation orient = image.imageOrientation; 
    switch(orient) { 

     case UIImageOrientationUp: //EXIF = 1 
      transform = CGAffineTransformIdentity; 
      break; 

     case UIImageOrientationUpMirrored: //EXIF = 2 
      transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
      transform = CGAffineTransformScale(transform, -1.0, 1.0); 
      break; 

     case UIImageOrientationDown: //EXIF = 3 
      transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationDownMirrored: //EXIF = 4 
      transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
      transform = CGAffineTransformScale(transform, 1.0, -1.0); 
      break; 

     case UIImageOrientationLeftMirrored: //EXIF = 5 
      boundHeight = bounds.size.height; 
      bounds.size.height = bounds.size.width; 
      bounds.size.width = boundHeight; 
      transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); 
      transform = CGAffineTransformScale(transform, -1.0, 1.0); 
      transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
      break; 

     case UIImageOrientationLeft: //EXIF = 6 
      boundHeight = bounds.size.height; 
      bounds.size.height = bounds.size.width; 
      bounds.size.width = boundHeight; 
      transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
      transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
      break; 

     case UIImageOrientationRightMirrored: //EXIF = 7 
      boundHeight = bounds.size.height; 
      bounds.size.height = bounds.size.width; 
      bounds.size.width = boundHeight; 
      transform = CGAffineTransformMakeScale(-1.0, 1.0); 
      transform = CGAffineTransformRotate(transform, M_PI/2.0); 
      break; 

     case UIImageOrientationRight: //EXIF = 8 
      boundHeight = bounds.size.height; 
      bounds.size.height = bounds.size.width; 
      bounds.size.width = boundHeight; 
      transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
      transform = CGAffineTransformRotate(transform, M_PI/2.0); 
      break; 

     default: 
      [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; 

    } 

    UIGraphicsBeginImageContext(bounds.size); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
     CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
     CGContextTranslateCTM(context, -height, 0); 
    } 
    else { 
     CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
     CGContextTranslateCTM(context, 0, -height); 
    } 

    CGContextConcatCTM(context, transform); 

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    [self setRotatedImage:imageCopy]; 
    //return imageCopy; 
}