2011-01-30 1 views
0

이 내 이미지 크기 조정 코드 :IKImageBrowserView는 내가 할 수있는 것보다 훨씬 빨리 이미지 크기를 조정할 수 있습니까?

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]; 

아니, 난 내 GUI가 물어 느낌 때문에 사진을 미리로드하기 위해 백그라운드 스레드에서이 모든 일을하고있다. CALayers가보기에 끝나기 위해 동기화를 얻는 작업과 설정하지 않은 작업이 필요했습니다.

그러나 나는 이것이 얼마나 빠른지를 설명하는 용어가 "개"라고 생각합니다.

IKImageView와 비교하면 스크롤 할 수있는 것보다 빠르게 이미지 축소판이 튀어 오릅니다.

아무도 내가 지금하고있는 것보다 더 잘 처리하는 방법에 대한 제안 사항이 있습니까?

다른 말로하면, 제 문제는 초고속 UX를 갖고 싶다는 것입니다. 이것을 달성하는 방법은 CALayers에 프리로드하는 것입니다 (이것이 잘못된 것일 수 있습니까? NSImageView와 IK-stuff를 시도했지만 적어도 CALayer는 그보다 낫습니다).

/처음 독자 - SO 규칙, 내 말은, 당신은 Google의 순위를 변경 ... omg! :) 여기

+0

OS X 10.5 호환성이 필요하거나 10.6 만 지원합니까? (이미 게시 한 코드에는 10.6이 필요하지만 명확히하는 데 도움이됩니다.) – NSGod

+0

10.6 만 유효합니다. app-store의 일종의 히트는 호환성에 "재설정"되었습니까? :) – Torkel

답변

1

ImageKit은 아마도 전체 이미지 파일을 읽는 대신 CGImageSourceCreateThumbnailAtIndex()을 사용하여 대상에 맞는 이미지를 빠르게 얻을 수 있습니다.

+0

흥미 롭다 !! NSImage는 거의 모든 이미지 파일 형식을 읽을 수 있기 때문에 NSImage를 사용하고 싶었습니다. 하지만 CGImageSource를 통해 파일을 읽을 수 있다면 먼저 테스트를하고, 실패하면 NSImage 만 사용하면됩니다. 속도를 비교해 보겠습니다. – Torkel

+0

'CGImageSourceCreateThumbnailAtIndex()'가 다른 것을 이해했는지 확인하십시오. 요점은 큰 이미지 전체를 다루지 않아도된다는 것을 의미합니다. –

+0

좋습니다. 답변입니다. 이 기능은 엄청나게 빠릅니다. 그러나 나는 내 삶이 그것에서 아주 흐린 이미지를 만들 수는 없다. (나는 kCGImageSourceThumbnailMaxPixelSize를 몇 백만 개에 넣으려고했지만 여전히 흐릿 해졌다.)또한 iPhoto는 이미지를로드하는 데 약 0.3 초 ​​정도 걸립니다. 그리고 이미지로드 방법의 가능한 모든 조합에 대해 테스트 한 결과 이제는 이미지를로드하고 크기를 조정하는 데 소요되는 시간이 얼마 남지 않았다고 생각합니다. – Torkel

0

이 : 그대로

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

가 그런 이미지를 사용합니다.

왜 앱이 느린 지에 대해서는 Instruments에서 실행하십시오. 이렇게하면 사용하는 프로세서 시간의 대부분을 소비하는 위치를 구체적으로 알 수 있습니다. 결국 스케일링 코드에 포함되지 않을 수도 있습니다.

* 10.6부터 이러한 메시지는 유용하지 않으며 더 이상 사용되지 않으므로 Snow Leopard 이상이 필요할 경우 생략 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 내 코드를이 코드로 교체했지만 속도는 같습니다. 그리고 일을하는 방식으로 어떤 이유로 뷰가 표시 될 때까지 처리가 완료되지 않은 것처럼 보입니다. (보기가 처음으로 표시되도록 설정되면 표시 될 때까지 거대한 (30 초) 지연이 있음). 지금 악기를 시험해 볼거야. – Torkel

+0

인스트루먼트는 그다지 많은 정보를주지 못했습니다. 그 로딩 이미지가 내 CPU 시간을 먹는 것보다 더 많은 것을 알 수있을만큼 충분히 능숙하지 않을 수도 있습니다 ... 다음은 CGImage를 대체하려고합니다. 여기서 또 다른 제안에 설명 된대로 NSImage를 사용하려고합니다. – Torkel

+0

@ 토켈 : "또 다른 제안"이란 무엇입니까? 그것이 바로이 제안입니다. ☺ –