菜鸟教程小白 发表于 2022-12-12 03:55:42

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


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

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

<p>这是我的 UIImageView 扩展:</p>

<pre><code>@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 = [ initWithContentsOfFile:path];
      UIImage * original = [[initWithData:imgData] autorelease];
      ;
      CGSize imgSize = original.size;
      float widthScale = size.width / imgSize.width;
      float heightScale = size.height / imgSize.height;
      float scaleFactor = widthScale;
      if (heightScale &lt; scaleFactor) {
            scaleFactor = heightScale;
      }
      UIImage * result = nil;
      //Scale if necessary
      if (scaleFactor &lt; 1.0) {
            result = [ initWithCGImage:original.CGImage scale:1/scaleFactor orientation:original.imageOrientation];
      } else {
            result = ;
      }
      NSLog(@&#34;Image prepeared on backgroud thread, update ui image on main..&#34;);
      dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@&#34;Begin updating image on main thread&#34;);
            self.image = result;
            ;
            [ postNotificationName:NTF_IMG_LOADED object:self];
            NSLog(@&#34;Updated&#34;);
      });

    });
    dispatch_release(queue);

}
@end
</code></pre>

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

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

<p>应用程序是为 iOS5+ 构建的..</p>

<p>谢谢,</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您实际上并没有调整图像的大小。 <code>-initWithCGImage:scale:</code>的<code>scale</code>参数设置图像像素与屏幕坐标点的比例;它对底层图像没有任何作用。您需要将图像实际绘制到 <code>CGContext</code> 以缩小它:</p>

<pre><code>    //Load image
    UIImage * original = [[ initWithContentsOfFile:path] autorelease];

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

    UIImage * result = nil;
    //Scale if necessary
    if (scaleFactor &lt; 1.0) {
      CGSize newSize = CGSizeMake(floorf(imgSize.width * scaleFactor),
                                    floorf(imgSize.height * scaleFactor));
      UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
      CGContextRef context = UIGraphicsGetCurrentContext();
      CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
      ;
      result = UIGraphicsGetImageFromCurrentImageContext();
      ;
      UIGraphicsEndImageContext();
    } else {
      result = ;
    }
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIImageView 性能不佳(用于本地镜像),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/15852820/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/15852820/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIImageView 性能不佳(用于本地镜像)