• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - UIImageView 性能不佳(用于本地镜像)

[复制链接]
菜鸟教程小白 发表于 2022-12-12 03:55:42 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在开发一个带有图库的应用程序。 所有图像都在设备光盘(文档目录)上,但我无法顺利显示。

由于有些图像很大(2000px * 2000px),我将它们加载到后台线程中,然后缩小它们,然后将它们显示在主线程上。

这是我的 UIImageView 扩展:

@implementation UIImageView (BackgroundResize) 

- (void)localImageFromPath: (NSString *) path scaledTo: (CGSize) size {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_async(queue, ^{
        //Load image
        NSData * imgData = [[NSData alloc] initWithContentsOfFile:path];
        UIImage * original = [[[UIImage alloc]  initWithData:imgData] autorelease];
        [imgData release];
        CGSize imgSize = original.size;
        float widthScale = size.width / imgSize.width;
        float heightScale = size.height / imgSize.height;
        float scaleFactor = widthScale;
        if (heightScale < scaleFactor) {
            scaleFactor = heightScale;
        }
        UIImage * result = nil;
        //Scale if necessary
        if (scaleFactor < 1.0) {
            result = [[UIImage alloc] initWithCGImageriginal.CGImage scale:1/scaleFactor orientationriginal.imageOrientation];
        } else {
            result = [original retain];
        }
        NSLog(@"Image prepeared on backgroud thread, update ui image on main..");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Begin updating image on main thread");
            self.image = result;
            [result release];
            [[NSNotificationCenter defaultCenter] postNotificationName:NTF_IMG_LOADED object:self];
            NSLog(@"Updated");
        });

    });
    dispatch_release(queue);

}
@end

在控制台输出中,一切似乎都很完美,所有调试字符串都在不到 1 秒的时间内显示(对于 6 个非常大的图像),但 UI 被阻止并且图像显示延迟 10 秒。

在 iOS 上显示大型本地镜像的正确方法是什么?

应用程序是为 iOS5+ 构建的..

谢谢,



Best Answer-推荐答案


您实际上并没有调整图像的大小。 -initWithCGImage:scale:scale参数设置图像像素与屏幕坐标点的比例;它对底层图像没有任何作用。您需要将图像实际绘制到 CGContext 以缩小它:

    //Load image
    UIImage * original = [[[UIImage alloc] initWithContentsOfFile:path] autorelease];

    CGSize imgSize = original.size;
    float widthScale = size.width / imgSize.width;
    float heightScale = size.height / imgSize.height;
    float scaleFactor = widthScale;
    if (heightScale < scaleFactor) {
        scaleFactor = heightScale;
    }

    UIImage * result = nil;
    //Scale if necessary
    if (scaleFactor < 1.0) {
        CGSize newSize = CGSizeMake(floorf(imgSize.width * scaleFactor),
                                    floorf(imgSize.height * scaleFactor));
        UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
        [original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        result = UIGraphicsGetImageFromCurrentImageContext();
        [result retain];
        UIGraphicsEndImageContext();
    } else {
        result = [original retain];
    }

关于ios - UIImageView 性能不佳(用于本地镜像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852820/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap