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