2011-04-21 7 views
1

実際に私は画像のサイズ変更に2つの方法を使用しましたが、私のクライアントは画像の品質が非常に悪いと言いますので、画像のサイズ変更に最適な方法を知りたいと思います。 私はスクリーンショットを撮り、480x320サイズのUIImageのスクリーンショットを以下の機能に送ります。画像の品質を損なうことなく画像のサイズを変更する最適な方法は何ですか?

- (UIImage *)makeResizedImage:(CGSize)newSize quality:(CGInterpolationQuality)interpolationQuality image:(UIImage *)inImage{ 
    NSLog(@"OriginalImage%f",inImage.size.width); 

    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 

    CGImageRef imageRef = [inImage CGImage]; 
    // Compute the bytes per row of the new image 
    size_t bytesPerRow = CGImageGetBitsPerPixel(imageRef)/CGImageGetBitsPerComponent(imageRef) * newRect.size.width; 
    bytesPerRow = (bytesPerRow + 15) & ~15; // Make it 16-byte aligned 

    // Build a bitmap context that's the same dimensions as the new size 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, 
               newRect.size.width, 
               newRect.size.height, 
               CGImageGetBitsPerComponent(imageRef), 
               bytesPerRow, 
               CGImageGetColorSpace(imageRef), 
               CGImageGetBitmapInfo(imageRef)); 

    CGContextSetInterpolationQuality(bitmap, interpolationQuality); 

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

    // Get the resized image from the context and a UIImage 
    CGImageRef resizedImageRef = CGBitmapContextCreateImage(bitmap); 
    UIImage *resizedImage = [UIImage imageWithCGImage:resizedImageRef]; 
    NSLog(@"ResizedImage%f",resizedImage.size.width); 
    NSLog(@"ResizedImage%f",resizedImage.size.height); 

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

    return resizedImage; 
} 

または

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

    // Build a context that's the same dimensions as the new size 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, 
               newRect.size.width, 
               newRect.size.height, 
               CGImageGetBitsPerComponent(imageRef), 
               0, 
               CGImageGetColorSpace(imageRef), 
               CGImageGetBitmapInfo(imageRef)); 

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

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

あなたはライブラリを統合する代わりに、独自のローリング試みるかもしれない、その品質

+0

どのように品質が低下していますか?ピクセル化、ぼかし、伸ばしなど何か? – blindjesse

答えて

関連する問題