2009-10-19 7 views
4

지금까지 iPhone에서 약 3 초 간격으로 여러 이미지를 찍는 앱을 만들었습니다. 별도의 스레드에서 각 이미지를 비동기 적으로 처리하고 있으며 iPhone 디스크에 이미지를 저장하는 순간까지 모든 것이 훌륭합니다. 그런 다음 JPEG 표현을 사용하여 이미지를 디스크에 저장하는 데 약 12 ​​초가 소요됩니다.기본 Camera iPhone 앱이 사진을 너무 빨리 저장하는 방법은 무엇입니까?

Apple은 어떻게 하나의 이미지를 디스크에 빠르게 저장합니까? 사용하는 트릭이 있습니까? 나는 애니메이션이 사용자를 오랫동안 산만하게하는 것을 보았지만 여전히 필요한 시간은 12 초 미만입니다!

미리 감사드립니다.

+0

흥미로운 질문입니다. 안드로이드는 써드 파티 앱을 위해하는 것처럼 자신의 카메라 앱에 대해 동일한 코드 ("액티비티")를 사용하는 것처럼 보입니다. 즉, 이미지를 저장하는 데 걸리는 시간과 동일한 시간이 걸립니다. 이상하게도 애플은 비슷한 일을하지 않는다. – jrockway

답변

2

나는이 시도하지 않은하지만 애플이 같은 방법을 사용하지 않도록해야하지 않을 저장 빠른 이미지 운이있다 같아요. Apple 디자인 철학의 큰 부분은 사용자의 운영 중단을 숨기는 데 있습니다. Apple 코드는 귀하의 시간과 많이 걸릴 수 있지만 사용자의 인식으로부터 전체 저장 시간을 숨기는 데 능숙합니다.

누군가가 Apple이 실제로 어떻게 더 빨리 저장하는지 말할 수 없다면 절약 시간을 위장하는 방법을 제안하는 것이 좋습니다.

+1

나는 애플이 애니메이션으로 저장 과정을 숨기고 있지만, 기본 카메라 앱으로 사진을 찍은 다음 홈 버튼을 눌러 앱을 닫으면 그 과정은 12 초 이내에 끝난다. 이미지는 카메라 롤에 있습니다. 나에게 이것은 절약 부분이 내가 아는 방법으로 더 빨리 지나가는 것을 의미한다. 저것은 나가 저축 과정을 숨기기 외에 저것을하는 어떤 다른 방법이다는 것을 나는 있있다. – worriorbg

+0

썸네일이 카메라 롤에 나타나기 만해도 파일이 완전히 저장되었다는 의미는 아닙니다.파일이 백그라운드에서 계속 저장되는 동안 Apple은 썸네일을 먼저 만들고 표시 할 수 있습니다. 실제로 디스크에서 파일을 만들고 닫을 수 없다면 Apple이 파일 처리를 얼마나 오래 수행하고 있는지 알 수 없습니다. Apple의 작업이 인터페이스의 단서를 기반으로하는 시간을 알아내는 것은 Apple이 일상적으로하는 인터페이스 트릭 때문에 매우 신뢰할 수 없습니다. – TechZen

0

Google을 조금 둘러 보면 같은 문제가있는 수많은 사람들이 있습니다.

답변을 찾지 못했습니다. 일반적인 결론은 사과가 일부 내부 API를 사용하고 공개 API 오버 헤드 또는 일부 하드웨어 인코더를 우회하는 것으로 보입니다.

+0

그건 내가 두려워하는거야. 또한 Apple이 사용하는 내부 API가 있다고 생각하지만 왜 사용하지 않을까요? JPEG 또는 PNG 표현과 NSData, 아마도 OpenGL 또는 다른 것을 사용하는 것 외에 저의 저축 속도를 높이는 또 다른 방법이 있습니까? – worriorbg

+0

웹상에서 대답이 없다고해서 해결책이 없다는 것을 의미하지는 않습니다 : 누군가가 그것을 출판하지 않고 발견 할 수있었습니다. Apple에서 승인 한 응용 프로그램을 테스트 한 결과 가능하다고 말할 수 있습니다. 하지만 ... 어떻게 ... 미스터리. – Oliver

4

실제로 Apple은 kernal 드라이버 AppleJPEGDriver를 사용합니다. 하드웨어 jpeg 인코딩 API이며 소프트웨어 인코딩 (JPEGRepresnetaion) 및 일부 사람들이 감옥 애플 리케이션 (cycorder 비디오 레코딩 응용 프로그램)에서 사용하는 것보다 훨씬 빠릅니다. 애플은 사용자에게 동일한 기능을 제공해야하지만 애플입니다. :)

0

내 중앙 애플 리케이션에서이 문제가 발생했습니다. 저장시 그랜드 센트럴 디스패치를 ​​사용했습니다.

다음은 이미지 캐시 클래스의 setImage 메소드입니다. UIImage에 이미지가 저장되어 있으면 이미지를 저장하고 그렇지 않으면 삭제합니다. 희망에 맞게이 기능을 적용 할 수 있으며 iOS 4 이상에서만 작동합니다. 코드에서 ARC를 사용할 수 있습니다.

-(void)setImage:(UIImage *)image{ 
    if (image == nil){ 
    NSLog(@"Deleting Image"); 
    // Since we have no image let's remove the cached image if it exists 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
        NSUserDomainMask, YES) objectAtIndex:0]; 
        [[NSFileManager defaultManager] removeItemAtPath:[cachePath 
        stringByAppendingPathComponent:@"capturedimage.jpg"] error:nil]; 
       }); 
    } 
else { 
     NSLog(@"Saving Image"); 
     // We've got an image, let's save it to flash memory. 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
        NSString *cachePath = 
        [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
        NSUserDomainMask, YES) objectAtIndex:0]; 
        NSData *dataObj = UIImagePNGRepresentation(image); 
        [dataObj writeToFile:[cachePath 
        stringByAppendingPathComponent:@"capturedimage.jpg"] atomically:NO]; 
        }); 
    } 

imageCache = image; 

} 
관련 문제