Почему IKImageBrowserView может изменять размеры изображений намного быстрее, чем я? - PullRequest
1 голос
/ 31 января 2011

Это мой код изменения размера изображения:

CALayer *newCALayer = [[CALayer layer] retain];
NSImage* image = [[NSImage alloc] initWithData:[NSData  dataWithContentsOfFile:path]];
CGImageRef newCGImageFullResolution = [image CGImageForProposedRect:nil context:nil hints:nil];
CGContextRef context = CGBitmapContextCreate(NULL, drawRect.size.width, drawRect.size.height,
                                             CGImageGetBitsPerComponent(newCGImageFullResolution),
                                             CGImageGetBytesPerRow(newCGImageFullResolution),
                                             CGImageGetColorSpace(newCGImageFullResolution),
                                             CGImageGetAlphaInfo(newCGImageFullResolution));
CGContextDrawImage(context, CGRectMake(0, 0, drawRect.size.width, drawRect.size.height), newCGImageFullResolution);
CGImageRef scaledImage = CGBitmapContextCreateImage(context);
newCALayer.contents = (id)scaledImage;
CGImageRelease(scaledImage);
newCALayer.contentsGravity = kCAGravityResizeAspect;
newCALayer.opacity = 0.0;
newCALayer.anchorPoint = CGPointMake(0.0f,0.0f);
newCALayer.frame = CGRectMake( 0.0, 
          0.0, 
          [Singleton sharedSingleton].fullscreenRect.size.width,
          [Singleton sharedSingleton].fullscreenRect.size.height);
[newCALayer setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
//CGImageRelease(cgImageFullResolution); (bonus points if you can explain why I can't release this! I mean, I can release the scaled image ok??)
CGContextRelease(context);
[image release];

Я делаю все это из фонового потока, чтобы предварительно загрузить картинки, чтобы мой графический интерфейс чувствовал себя быстро.Потребовалась некоторая работа по настройке синхронизации, а не по настройке, чтобы CALayers оказались в поле зрения.

Но я считаю, что термин для описания того, как быстро это будет, будет "это собака".

По сравнению с IKImageView - эта штука поднимает миниатюры изображений быстрее, чем я могу прокручивать.

У кого-нибудь есть какие-либо предложения о том, как справиться с этим лучше, чем я делаю сейчас?

Другими словамиМоя проблема в том, что я хочу иметь супер-быстрый UX.Я считаю, что способ сделать это - предварительно загрузить вещи в CALayers (это может быть неправильно? Я пробовал NSImageView и некоторые IK-вещи, но, по крайней мере, CALayer лучше, чем это).

Ответы [ 2 ]

2 голосов
/ 31 января 2011

ImageKit, вероятно, использует CGImageSourceCreateThumbnailAtIndex() для быстрого получения изображения, соответствующего месту назначения, а не для чтения во всем файле изображения.

1 голос
/ 31 января 2011

Здесь:

NSImage *image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease];
[image setScalesWhenResized:YES]; // *
[image setDataRetained:YES]; // *
[image setSize:desiredNewSize];

Затем используйте изображение как есть.

Что касается того, почему ваше приложение работает медленно, запустите его в разделе «Инструменты».Это точно скажет вам, на что вы тратите большую часть процессорного времени, которое вы используете - в конце концов, его может не быть в вашем коде масштабирования.

* Начиная с 10.6, эти сообщения не делают ничего полезного и устарели, поэтомуможете пропустить их, если вам требуется Snow Leopard или более поздняя версия.

...