1

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

目前,图标在视网膜设备上显示正确大小,但在非视网膜设备上显示两倍大小。

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

如何在非视网膜设备上按比例缩小 UIImage,以便所有设备显示相同的大小?

4

3 回答 3

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 应该缩放它并正确显示

于 2012-09-10T16:22:15.747 回答
0

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

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

为了避免每次都输入这个,你可以在 UIScreen 上声明一个类别,它在 -realScale 方法或其他东西中使用这个代码。

于 2012-09-10T16:29:10.330 回答
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);
}
于 2012-09-10T16:21:50.880 回答