2013-04-08 2 views
0

카메라 롤 이미지의 크기가 축소되어 아티팩트가 표시됩니다.iPhone 카메라 롤 이미지 크기를 줄이면 예기치 않은 아티팩트가 발생합니다.

샘플 이미지 :

Before

After

 CGSize s = CGSizeMake(320, 320); 
    UIImage *scaledImage = [picture resizedImageWithContentMode:contentMode 
                bounds:s 
             interpolationQuality:kCGInterpolationHigh]; 

이미지는 720x960이다 .. 비는 중요하지 않기 때문에 일어나는인가?

/** 
* Returns a copy of this image that is cropped to the given bounds. 
* The bounds will be adjusted using CGRectIntegral. 
* This method ignores the image's imageOrientation setting. 
*/ 

    - (UIImage *)croppedImage:(CGRect)bounds { 

     CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds); 
     UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 

     CGImageRelease(imageRef); 

     return croppedImage; 
    } 

/** 
* Returns a rescaled copy of the image, taking into account its orientation 
* The image will be scaled disproportionately if necessary to fit the bounds specified by the parameter 
*/ 

    - (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality { 

     BOOL drawTransposed; 

     CGAffineTransform transform = CGAffineTransformIdentity; 

     switch (self.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
     drawTransposed = YES; 
     break; 
     default: 
     drawTransposed = NO; 
     } 

     transform = [self transformForOrientation:newSize]; 

     return [self resizedImage:newSize 
         transform:transform 
       drawTransposed:drawTransposed 
      interpolationQuality:quality]; 
    } 

/** 
* Resizes the image according to the given content mode, taking into account 
* the image's orientation 
*/ 

    - (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode 
             bounds:(CGSize)bounds 
         interpolationQuality:(CGInterpolationQuality)quality { 

     CGFloat horizontalRatio = bounds.width/self.size.width; 
     CGFloat verticalRatio = bounds.height/self.size.height; 
     CGFloat ratio; 

     switch (contentMode) { 
     case UIViewContentModeScaleAspectFill: 
      ratio = MAX(horizontalRatio, verticalRatio); 
      break; 

     case UIViewContentModeScaleAspectFit: 
      ratio = MIN(horizontalRatio, verticalRatio); 
      break; 

     default: 
      [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode]; 
     } 

     ratio = MIN(horizontalRatio, verticalRatio); 

     CGSize newSize = CGSizeMake(self.size.width * ratio, self.size.height * ratio); 

     return [self resizedImage:newSize interpolationQuality:quality]; 
    } 

    #pragma mark - Private helper methods 

    /** 
    * Returns a copy of the image that has been transformed using the given affine transform and scaled to the new size 
    * The new image's orientation will be UIImageOrientationUp, regardless of the current image's orientation 
    * If the new size is not integral, it will be rounded up 
    */ 

    - (UIImage *)resizedImage:(CGSize)newSize 
        transform:(CGAffineTransform)transform 
       drawTransposed:(BOOL)transpose 
     interpolationQuality:(CGInterpolationQuality)quality { 

     CGRect newRect  = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
     CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width); 
     CGImageRef imageRef = self.CGImage; 

     /** 
     * Fix for a colorspace/transparency issue that affects some types of 
     * images. See here: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/comment-page-2/#comment-39951 
     */ 

     CGContextRef bitmap =CGBitmapContextCreate(NULL, 
               newRect.size.width, 
               newRect.size.height, 
               8, 
               0, 
               CGImageGetColorSpace(imageRef), 
               kCGImageAlphaNoneSkipLast); 

     // Rotate and/or flip the image if required by its orientation 
     CGContextConcatCTM(bitmap, transform); 

    // CGContextSetShouldAntialias(bitmap,YES); 

     // Set the quality level to use when rescaling 
     CGContextSetInterpolationQuality(bitmap, quality); 

     // Draw into the context; this scales the image 
     CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef); 

     // Get the resized image from the context and a UIImage 
     CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap); 
     UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

     // Clean up 
     CGContextRelease(bitmap); 
     CGImageRelease(newImageRef); 

     return newImage; 
    } 

    /** 
    * Returns an affine transform that takes into account the image orientation 
    * when drawing a scaled image 
    */ 

    - (CGAffineTransform)transformForOrientation:(CGSize)newSize { 

     CGAffineTransform transform = CGAffineTransformIdentity; 

     switch (self.imageOrientation) { 
     case UIImageOrientationDown:   // EXIF = 3 
     case UIImageOrientationDownMirrored: // EXIF = 4 
      transform = CGAffineTransformTranslate(transform, newSize.width, newSize.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationLeft:   // EXIF = 6 
     case UIImageOrientationLeftMirrored: // EXIF = 5 
      transform = CGAffineTransformTranslate(transform, newSize.width, 0); 
      transform = CGAffineTransformRotate(transform, M_PI_2); 
      break; 

     case UIImageOrientationRight:   // EXIF = 8 
     case UIImageOrientationRightMirrored: // EXIF = 7 
      transform = CGAffineTransformTranslate(transform, 0, newSize.height); 
      transform = CGAffineTransformRotate(transform, -M_PI_2); 
      break; 
     default: 
      break; 
     } 

     switch (self.imageOrientation) { 
     case UIImageOrientationUpMirrored:  // EXIF = 2 
     case UIImageOrientationDownMirrored: // EXIF = 4 
      transform = CGAffineTransformTranslate(transform, newSize.width, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 

     case UIImageOrientationLeftMirrored: // EXIF = 5 
     case UIImageOrientationRightMirrored: // EXIF = 7 
      transform = CGAffineTransformTranslate(transform, newSize.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 
     default: 
      break; 
     } 

     return transform; 
    } 
+0

이미지의 일부/이전 이미지를 게시하면 어떤 유형의 이슈가 표시되는지 확인할 수 있습니다. – memmons

+0

완료. 그들은 흐릿 해 보인다. 제가 해상도로 축소하고 있기 때문에 유물이 거기에 있지 않을 것으로 기대합니다. – quantumpotato

+0

아이폰 앱의 iPad에서 2x 기능을 사용하여 일부 유물을 소개합니다. – bshirley

답변

0

내가 잘못 처리 끝낼 수 있습니다 이미지의 메타 데이터 부분이 있기 때문에 자신의 크기를 조정 UIImage 처리하지 않을 :

여기 내있는 UIImage 범주 클래스입니다. 크기 조정을 통해 들어올 수있는 예기치 않은 아티팩트에 대한 훌륭한 기사가 있습니다.

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

내가 꽤 잘 작동 CocoaPod,에있는 UIImage 크기 조정 라이브러리를 사용하고 있습니다.

아마도이 답변은 원하는 답변이 아니지만 다른 관점에서 정보를 제공 할 수 있습니다.

관련 문제