我正在尝试在后台线程中加载UIImages,然后在iPad上显示它们.但是,当我将imageViews的视图属性设置为图像时,会出现断断续续的情况.我很快发现iOS上的图像加载是懒惰的,并且在这个问题中找到了部分解决方案:
在UI线程上懒洋洋地加载CGImage/UIImage会导致口吃
这实际上会强制图像加载到线程中,但在显示图像时仍然存在断断续续的情况.
你可以在这里找到我的示例项目:http://www.jasamer.com/files/SwapTest.zip(编辑:修复版),检查SwapTestViewController.尝试拖动图片以查看口吃.
我创建的测试代码是断断续续的(forceLoad方法是我从上面发布的堆栈溢出问题中获取的方法):
NSArray* imagePaths = [NSArray arrayWithObjects:
[[NSBundle mainBundle] pathForResource: @"a.png" ofType: nil],
[[NSBundle mainBundle] pathForResource: @"b.png" ofType: nil], nil];
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock: ^(void) {
int imageIndex = 0;
while (true) {
UIImage* image = [[UIImage alloc] initWithContentsOfFile: [imagePaths objectAtIndex: imageIndex]];
imageIndex = (imageIndex+1)%2;
[image forceLoad];
//What's missing here?
[self performSelectorOnMainThread: @selector(setImage:) withObject: image waitUntilDone: YES];
[image release];
}
}];
Run Code Online (Sandbox Code Playgroud)
我知道可以避免口吃的原因有两个:
(1)Apple可以在照片应用中加载图像而不会出现断断续续的情况
(2)在上述代码的此修改版本中,placeholder1和placeholder2已显示一次后,此代码不会导致断断续续:
UIImage* placeholder1 = …Run Code Online (Sandbox Code Playgroud) 我正在将图像转换为MOV文件,并且有一件有趣的事情发生在我身上.我记录了每个颜色分量的位数,每个像素的位数和每行的字节数.这是我的代码:
NSLog(@"Image width: %d, Height: %d", CGImageGetWidth(image), CGImageGetHeight(image));
NSLog(@"BPC: %d \ BPP: %d \ ByPR: %d", CGImageGetBitsPerComponent(image), CGImageGetBitsPerPixel(image), CGImageGetBytesPerRow(image));
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
图像宽度:300,高度:300(一切都如预期的那样)BPC:8(每种颜色8位......到目前为止很好)BPP:32(32 = 4个组件ARGB*每个颜色8位......得到它)ByPR :1216(每行300 px*每像素4个字节=每行1200个字节)
为什么我每行记录1216个字节,而不是1200?顺便说一句,这不仅仅是一个侥幸.当我根据缓冲区大小的数字创建视频时,它可以工作.当我用每行1200字节创建它时,我得到一些混乱的混叠效果.
思考?
的石英2D节目指南定义了各种α-存储模式的可用性:

我们应该将哪些用于RGB上下文,为什么?
对于非不透明的上下文,kCGImageAlphaPremultipliedFirst或kCGImageAlphaPremultipliedLast?
对于不透明的上下文,kCGImageAlphaNoneSkipFirst还是kCGImageAlphaNoneSkipLast?
价值的选择是否会影响绩效?
通常,我会看到kCGImageAlphaPremultipliedFirst非透明和kCGImageAlphaNoneSkipFirst不透明的上下文.有些人说这些表现更好,但我没有看到任何关于此的确凿证据或文件.
快速搜索GitHub的显示,开发商的青睐kCGImageAlphaPremultipliedFirst了kCGImageAlphaPremultipliedLast和kCGImageAlphaNoneSkipLast超过kCGImageAlphaNoneSkipFirst.可悲的是,这只不过是轶事证据.