1

UIImageiPhone の写真アプリのように画像のサイズを変更するためのカテゴリを作成しました。

補間は高く設定されていますが、画像は写真アプリの画像のようには見えません。unsharp代わりに、またはに見えますblurry

これが私がしたことです:

    - (UIImage *)resizeImageProportionallyIntoNewSize:(CGSize)newSize;
    {
    CGFloat scaleWidth = 1.0f;
    CGFloat scaleHeight = 1.0f;

    NSLog(@"Origin Size = %@", NSStringFromCGSize(self.size));

    if (CGSizeEqualToSize(self.size, newSize) == NO) {

        //calculate "the longer side"
        if(self.size.width > self.size.height) {
            scaleWidth = self.size.width / self.size.height;
        } else {
            scaleHeight = self.size.height / self.size.width;
        }
    }    

    // now draw the new image in a context with scaling proportionally
    UIImage *sourceImage = self;
    UIImage *newImage = nil;

    //now we create a context in newSize and draw the image out of the bounds of the context to get
    //an proportionally scaled image by cutting of the image overlay
    if([[UIScreen mainScreen] scale] == 2.00) {
         UIGraphicsBeginImageContextWithOptions(newSize, YES, 2.0);
    }
    UIGraphicsBeginImageContext(newSize);
    // Set the quality level to use when rescaling
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

    //Center image point so that on each egde is a little cutoff
    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.size.width  = (int) newSize.width * scaleWidth;
    thumbnailRect.size.height = (int) newSize.height * scaleHeight;
    thumbnailRect.origin.x = (int) (newSize.width - thumbnailRect.size.width) * 0.5;
    thumbnailRect.origin.y = (int) (newSize.height - thumbnailRect.size.height) * 0.5;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;
}

ところで:高補間を使用するかどうかに違いはありません。たぶん私は何か間違ったことをしています。

よろしくお願いします。

4

2 に答える 2

2

サムネイルを作成する最善の方法は、Image I/O Framework を使用してシステムに依頼することです。唯一の秘訣は、CGImage を使用しているため、画面の解像度を考慮する必要があることです。

CGImageSourceRef src = CGImageSourceCreateWith... // whatever
CGFloat scale = [UIScreen mainScreen].scale;
CGFloat w = // maximum size, multiplied by the scale
NSDictionary* d = 
    [NSDictionary dictionaryWithObjectsAndKeys:
     (id)kCFBooleanTrue, kCGImageSourceShouldAllowFloat,
     (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailWithTransform,
     (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageAlways,
     [NSNumber numberWithInt:(int)w], kCGImageSourceThumbnailMaxPixelSize,
     nil];
CGImageRef imref = 
    CGImageSourceCreateThumbnailAtIndex(src, 0, (__bridge CFDictionaryRef)d);
UIImage* im = 
    [UIImage imageWithCGImage:imref scale:scale orientation:UIImageOrientationUp];
CFRelease(imref); CFRelease(src);
于 2012-12-21T19:29:45.853 に答える
0

鮮明でない/ぼやけている場合は、次の方法でアンチエイリアスをオフにしてみてください。

CGContextSetShouldAntialias(context, NO);

お役に立てれば。

于 2012-12-21T19:14:54.967 に答える