2009-10-19 3 views
4

До сих пор мне удалось создать приложение для iPhone, которое принимает несколько изображений с интервалом в 3 секунды между ними. Я обрабатываю каждое изображение в отдельном потоке асинхронно, и все отлично, пока не дойдет до момента сохранения изображения на диске iPhone. Затем для сохранения изображения на диск требуется изображение в формате JPEG.Какое приложение по умолчанию для камеры iPhone позволяет быстро сохранить фотографию?

Как Apple делает это, как им удается сохранить одно изображение так быстро на диске, есть ли уловка, которую они используют? Я видел, что анимация отвлекает пользователя на некоторое время, но все же необходимое время составляет менее 12 секунд!

Заранее спасибо.

+0

Интересный вопрос. Android, похоже, использует тот же код («активность») для своего собственного приложения для камеры, что он делает для сторонних приложений; это означает, что для сохранения изображения требуется столько же времени, независимо от того, откуда вы его принимаете. Странно, что Apple ничего подобного не делает. – jrockway

ответ

2

Я не пробовал это, но я не был бы так уверен, что компания Apple не использует те же методы изображения. Большая часть философии дизайна Apple основана на скрытии операционных прерываний от пользователя. Код Apple может занимать столько же времени, сколько и ваш, но просто ловко скрыть все время сохранения от восприятия пользователя.

Если кто-то не может сказать вам, как Apple действительно экономит быстрее, я бы предложил посмотреть, как скрыть время сбережения.

+1

Я знаю, что Apple скрывает процесс сохранения с помощью анимации, но все же, если вы делаете снимок с помощью приложения камеры по умолчанию и затем в то же время нажимаете кнопку «домой», чтобы закрыть приложение, процесс занимает менее 12 секунд, а изображение находится в рулоне камеры. Для меня это означает, что спасительная часть проходит быстрее, чем по методам, которые я знаю. Вот как я знаю, что есть и другой способ сделать это, кроме скрытия процесса сбережений. – worriorbg

+0

Просто потому, что эскиз, отображаемый в рулоне камеры, не означает, что файл был полностью сохранен.Apple может просто создать и отобразить миниатюру сначала, пока файл продолжает сохранять в фоновом режиме. Если вы не сможете фактически просмотреть файл на диске, который будет создан и закрыт, вы не знаете, сколько времени занимает Apple для выполнения процесса файла. Попытка выяснить, как долго работает Apple, основанная на подсказках интерфейса, очень ненадежна из-за интерфейсных трюков, которые Apple регулярно вытягивает. – TechZen

0

Если вы немного рекламируете Google ... существует целая группа людей с той же проблемой.

Я не нашел ответа. Общий вывод, по-видимому, заключается в том, что Apple либо использует некоторые внутренние api, либо обходит public api служебные или некоторые аппаратные кодировщики.

Думаю, вы не повезло для быстрой экономии

+0

Вот что я боюсь. Я также думаю, что есть некоторый внутренний API, который использует Apple, но почему мы не предполагаем его использовать. Есть ли другой способ ускорить мою экономию, помимо использования JPEG или PNG-представления и NSData, может быть, OpenGL или что-то еще? – worriorbg

+0

Нет ответа в Интернете, это не значит, что нет решения :-) Кто-то мог найти его, не опубликовав его. Насколько я проверял приложения Apple, я могу сказать, что это возможно. Но ... как ... тайна. – Oliver

4

На самом деле яблоко использует свой драйвер ядра AppleJPEGDriver. Это аппаратное кодирование jpeg и намного быстрее, чем программная кодировка (JPEGRepresnetaion), и некоторые люди, использующие его в своих приложениях для джейлбрейка (приложение для записи видеозаписей). Apple должна предоставлять одинаковые функции своим пользователям, но они являются яблоками :)

0

У меня была эта проблема в моем приложении, при сохранении она зависала, поэтому я использовал Grand Central dispatch.

Ниже приведен метод 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; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^