gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:40 24 4
gpt4 key购买 nike

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

由于有些图像很大 (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] initWithCGImage:original.CGImage scale:1/scaleFactor orientation:original.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+ 构建的..

谢谢,

最佳答案

您实际上并没有调整图像大小。 -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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com