如何缩小从远程服务器加载非视网膜iPhone的视网膜图像?

时间:2012-09-10 16:13:11

标签: iphone ios uiimage scale retina-display

我必须从远程来源为我的应用程序加载图标,图像为50x50px,以25x25px显示在设备上。

目前,图标在视网膜设备上显示的尺寸正确,但非视网膜设备的尺寸是其两倍。

仅供参考:远程信号源无法提供非视网膜图像。

如何缩小非视网膜设备上的UIImage,以便所有设备显示相同的尺寸?

3 个答案:

答案 0 :(得分:7)

首先检查你是否有Retina显示器

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){

然后你需要设置图像的缩放选项:

UIImage * scaledImage = [UIImage alloc];
scaledImage = [[scaledImage initWithCGImage:[resourceImage CGImage] scale:2.0 orientation:UIImageOrientationUp] autorelease];

然后我相信imageView应该缩放它并正确显示

答案 1 :(得分:0)

试试这个:

+ (UIImage *) onScaleImage:(UIImage *)image width:(int)width
{
    CGImageRef imageRef = image.CGImage;

    NSUInteger nWidth = CGImageGetWidth(imageRef);
    if (nWidth == width)
        return (nil);

    double dScaleFactor = (double)width / (double)nWidth;

    NSUInteger nHeight = (int)((double)CGImageGetHeight(imageRef) * dScaleFactor);

    CGContextRef context = CGBitmapContextCreate(NULL, width, nHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, true);

    CGContextDrawImage (context, CGRectMake(0, 0, width, nHeight), imageRef);
    CGImageRef imageRefScaled = CGBitmapContextCreateImage(context);

    // caller must retain
    UIImage *imageScaled = [[UIImage alloc] initWithCGImage:imageRefScaled];

    CGContextRelease (context);
    CGImageRelease (imageRefScaled);

    return (imageScaled);
}

答案 2 :(得分:0)

好吧,您可以在if语句中包含对它的每次调用,如下所示:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    //do scale stuff here
}

为避免每次都输入此内容,您可以在UIScreen上声明一个类别,该类别在-realScale方法或其他内容中使用此代码。

相关问题