代码之家  ›  专栏  ›  技术社区  ›  Jonah

是否可以在uiscrollView中平铺图像而不必手动创建所有平铺?

  •  14
  • Jonah  · 技术社区  · 15 年前

    在iPhone示例代码中” PhotoScroller 从WWDC2010年开始,他们展示了如何通过滚动、缩放和图像分页来非常好地模仿照片应用程序。它们还平铺图像以显示如何显示高分辨率图像并保持良好的性能。

    在示例代码中,通过抓取不同分辨率的预缩放和剪切图像,并将其放置在构成整个图像的网格中来实现平铺。

    我的问题是:有没有一种方法可以不用手动浏览所有照片并创建“平铺”图像?照片应用程序如何能够在飞行中显示大图像?

    编辑 下面是Deepa答案中的代码:

    - (UIImage *)tileForScale:(float)scale row:(int)row col:(int)col size:(CGSize)tileSize  image:(UIImage *)inImage
    {
    CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height);
    CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect);
    UIImage *tileImage = [UIImage imageWithCGImage:tiledImage]; 
    return tileImage;
    }
    
    5 回复  |  直到 12 年前
        1
  •  12
  •   WrightsCS    14 年前

    下面是用于平铺图像生成的代码:

    在Photoscroller源代码中,将tileForScale:row:col:替换为以下内容:

    InImage-要创建图块的图像

    - (UIImage *)tileForScale: (float)scale row: (int)row column: (int)col size: (CGSize)tileSize image: (UIImage*)inImage
    {
        CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height);
        CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect);
        UIImage *tileImage = [UIImage imageWithCGImage: tiledImage];
        return tileImage;
    }
    

    当做, 迪帕塔

        2
  •  5
  •   iwasrobbed    15 年前

    我发现这可能有帮助: http://www.mikelin.ca/blog/2010/06/iphone-splitting-image-into-tiles-for-faster-loading-with-imagemagick/

    你只需在 Terminal 作为你的Mac上的shell脚本。

        3
  •  3
  •   Jorge Ortiz    14 年前

    对不起约拿,但我认为你不能做你想做的事。

    我一直在用同样的例子作为参考来实现一个漫画应用程序,我也有同样的疑问。最后,我意识到,即使你能在第一次使用时加载图像并将其切割成瓷砖,你也不应该这样做。原因有两个:

    1. 你这样做是为了节省时间和反应更迅速。加载和平铺大型图像需要时间。
    2. 前一个原因在用户第一次运行应用程序时尤为重要。

    如果这两个原因对你没有意义,而你仍然想这样做,我会用石英来制作瓷砖。CGIMAGE函数 CGImageCreateWithImageInRect 会是我的出发点。

        4
  •  3
  •   Ben Jackson    13 年前

    上面Deepa的回答将把整个图像作为一个uiimage(函数中的输入变量)加载到内存中,从而破坏了平铺的目的。

        5
  •  2
  •   alexantd    14 年前

    许多图像格式支持基于区域的解码。不需要将整个图像加载到内存中,解压缩整个内容,丢弃除感兴趣区域(ROI)以外的所有内容,您只需按需加载和解码ROI。在大多数情况下,这就不需要预先生成和保存图像块。我从来没有用过ImageMagick,但如果它不能做到,我会很惊讶。(i 使用Java高级成像(JAI)API来完成它,这对iPhone没有帮助。

    我已经用过这个photoscroller的例子,它处理预生成的图块的方式只是演示catiledlayer背后的思想,并创建一个有效的独立项目。替换图像平铺加载策略很简单-只需重写平铺视图 tileForScale:row:col: 方法从其他源返回uiimage图块,无论是Quartz或ImageMagick或其他什么源。