我必须从远程源加载我的应用程序的图标,图像为 50x50px,以 25x25px 显示在设备上。
目前,图标在视网膜设备上显示正确大小,但在非视网膜设备上显示两倍大小。
仅供参考:远程源无法提供非视网膜图像。
如何在非视网膜设备上按比例缩小 UIImage,以便所有设备显示相同的大小?
我必须从远程源加载我的应用程序的图标,图像为 50x50px,以 25x25px 显示在设备上。
目前,图标在视网膜设备上显示正确大小,但在非视网膜设备上显示两倍大小。
仅供参考:远程源无法提供非视网膜图像。
如何在非视网膜设备上按比例缩小 UIImage,以便所有设备显示相同的大小?
首先检查你是否有 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 应该缩放它并正确显示
好吧,您可以将每次调用都包含在 if 语句中,如下所示:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
//do scale stuff here
}
为了避免每次都输入这个,你可以在 UIScreen 上声明一个类别,它在 -realScale 方法或其他东西中使用这个代码。
尝试这个:
+ (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);
}