2012-08-25 108 views
0

如何縮放圖像的質量。我正在使用下面的代碼,但是當我使用來自Camera的圖像顯示在不同的框架中時。如何縮放圖像?

-(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; 
} 

如果有無論如何,以減少大小,而不會影響到質量,請提前

回答

0

建議 由於爲了減少大小,你將不得不對圖像的分辨率妥協。我建議你爲圖像計算一個新的WIDTH和HEIGHT。

這裏的東西,爲我工作:

試試這個:

-(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

請注意,這不會工作時,alpha信息不受支持或有一些其他位圖信息必要。您應該屏蔽掉alpha位,然後將其設置爲kCGImageAlphaPremultipliedFirst。 – Nuoji

0

我用下面的代碼規模相機圖像的圖像。請執行,如果你發現幫助ful

- (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; 
}