изменение размера UIImage камеры, возвращаемого UIImagePickerController, занимает до смешного много времени, если вы делаете это обычным способом, как в этот пост.
[обновление: здесь последний призыв к творческим идеям! я думаю, следующий вариант - спросить Apple.]
Да, это много пикселей, но графическое оборудование iPhone прекрасно способно рисовать много текстурированных квадратов 1024x1024 на экране за 1/60 секунды, так что действительно должен быть способ уменьшить размер изображения 2048x1536 до 640х480 намного меньше 1,5 секунд.
Так почему это так медленно? Являются ли базовые данные изображения, которые ОС возвращает из средства выбора, каким-то образом не готовыми к отрисовке, поэтому их нужно каким-то образом изменить, с чем не может помочь графический процессор?
Я предполагаю, что его нужно преобразовать из RGBA в ABGR или что-то в этом роде; Может ли кто-нибудь придумать способ убедить систему предоставить мне данные быстро, даже если они в неправильном формате, и я сам займусь этим позже?
Насколько мне известно, в iPhone нет выделенной «графической» памяти, поэтому не может быть и речи о перемещении данных изображения из одного места в другое.
Итак, вопрос: есть ли какой-нибудь альтернативный метод рисования, помимо использования CGBitmapContextCreate и CGContextDrawImage, который использует больше преимуществ графического процессора?
Есть кое-что для исследования: если я начну с UIImage того же размера, который не из средства выбора изображений, будет ли он столь же медленным? Очевидно нет...
Обновление: Мэтт Лонг обнаружил, что для изменения размера изображения, которое вы получаете обратно из средства выбора в [info objectForKey:@"UIImagePickerControllerEditedImage"]
, требуется всего 30 мс, если вы включили кадрирование с помощью ручного управления камерой. Это бесполезно для случая, когда меня волнует, где я использую takePicture
для программной съемки. Я вижу, что отредактированное изображение kCGImageAlphaPremultipliedFirst
, но исходное изображение kCGImageAlphaNoneSkipFirst
.
Дальнейшее обновление: Джейсон Кроуфорд предложил CGContextSetInterpolationQuality(context, kCGInterpolationLow)
, который на самом деле сокращает время примерно с 1,5 до 1,3 секунды за счет качества изображения - но это все еще далеко от скорости, на которую должен быть способен графический процессор!
Последнее обновление перед истечением недели: пользователь refulgentis провел некоторое профилирование, которое, похоже, указывает на то, что 1,5 секунды уходит на запись захваченного изображения с камеры на диск в формате JPEG, а затем его чтение обратно. Если это правда , очень странно.