Редактирование изображений с помощью iphone - PullRequest
1 голос
/ 20 декабря 2009

Я создаю приложение для редактирования изображений для iphone. Я хотел бы позволить пользователю выбрать изображение из фотобиблиотеки, отредактировать его (оттенки серого, сепия и т. д.) и, если возможно, сохранить обратно в файловую систему. Я сделал это для выбора изображения (самая простая вещь, как вы знаете, используя imagepicker), а также для создания изображения в оттенках серого. Но я застрял с сепией. Я не знаю, как это реализовать. Можно ли получить значения каждого пикселя изображения, чтобы мы могли изменять его, чтобы получить желаемый эффект. Или какие-либо другие возможные методы есть ??? Пожалуйста, помогите ...

1 Ответ

1 голос
/ 20 декабря 2009

Код средства выбора изображений Apple, скорее всего, будет содержать только имена файлов и некоторые изображения с более низким разрешением в ОЗУ до последнего момента, когда пользователь выбирает изображение.

Когда вы запрашиваете полнокадровый буфер изображения, ЦПУ неожиданно приходится выполнять гораздо больше работы, декодируя изображение при полном разрешении , но это может быть даже так просто, как запустить его выкл:

CFDataRef CopyImagePixels(CGImageRef inImage)
{
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage));
}

/* IN MAIN APPLICATION FLOW - but see EDIT 2 below */
const char* pixels = [[((NSData*)CopyImagePixels([myImage CGImage]))
  autorelease] bytes]; /* N.B. returned pixel buffer would be read-only */

Это всего лишь предположение о том, как это работает, но основано на некотором опыте обработки изображений в других контекстах. Чтобы понять, имеет ли смысл то, что я предлагаю, с точки зрения использования памяти, хорошо, запустите Instruments.

Документы Apple говорят (связанные, могут относиться к вам):

Вам следует избегать создания объектов UIImage, размер которых превышает 1024 x 1024. Помимо большого объема памяти, которое потребляет такое изображение, у вас могут возникнуть проблемы при использовании изображения в качестве текстуры в OpenGL ES или при рисовании изображения в виде или слое. Это ограничение размера не применяется, если вы выполняете манипуляции на основе кода, такие как изменение размера изображения, превышающего 1024 x 1024 пикселей, путем рисования его в графическом контексте с растровой поддержкой. Фактически, вам может потребоваться изменить размер изображения таким образом (или разбить его на несколько меньших изображений), чтобы нарисовать его в одном из ваших видов. [http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html]

И

Примечание. До версии iPhone OS 3.0 экземпляры UIView могут иметь максимальную высоту и ширину 1024 x 1024. В iPhone OS 3.0 и более поздних версиях представления больше не ограничены этим максимальным размером, но все еще ограничены объемом памяти. они потребляют. Поэтому в ваших же интересах сохранять размеры просмотра как можно меньшими. Независимо от того, какая версия iPhone OS запущена, вам следует рассмотреть возможность использования объекта CATiledLayer, если вам нужно создать представления размером более 1024 x 1024. [http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html]

Также стоит отметить: -

(a) Официальные инструкции

http://developer.apple.com/iphone/library/qa/qa2007/qa1509.html

(б) С http://cameras.about.com/od/cameraphonespdas/fr/apple-iphone.htm

"Размер изображения, загружаемого на ваш компьютер, составляет 1600x1200, но если вы отправите фотографию по электронной почте непосредственно с iPhone, размер будет уменьшен до 640x480."

(c) Для кодирования больших изображений со сжатием изображений JPEG требуется большой объем оперативной памяти, в зависимости от размера, возможно, большего объема, чем доступно для приложения.

(d) Может быть возможно использовать альтернативный алгоритм сжатия с (при необходимости) перестроенным его malloc для использования файлов, отображенных во временную память. Но рассмотрим вопросы конфиденциальности / безопасности данных.

(e) Из iPhone SDK: после ввода определенного количества символов анимация просто не загружается

"Я думал, что это может быть проблема с размером слоя, так как iPhone имеет ограничение размера текстуры 1024 x 1024 (после чего вам нужно использовать CATiledLayer для поддержки вашего UIView), но я смог выложить текст шире, чем 1024 пикселей и до сих пор есть эта работа. "

Иногда ограничение в 1024 пикселя может показаться немного мягким, но я всегда советую вам программировать с защитой и оставаться в пределах 1024 пикселя, если можете.

РЕДАКТИРОВАТЬ 1

Добавлен дополнительный разрыв строки в коде.

РЕДАКТИРОВАТЬ 2

Oops! Код получает копию данных только для чтения (существует различие между CFMutableDataRef и CFDataRef). Из-за ограничений на доступную оперативную память вы должны будете сделать копию в более низком разрешении, сглаживая ее самостоятельно, или скопировать ее в модифицируемый буфер, если изображение большого размера, вам может понадобиться записать его в полосах во временный файл освободите неизменяемый блок данных и загрузите данные обратно из файла. И делайте это, конечно, только если допустимо наличие данных во временном файле. Болезненные.

РЕДАКТИРОВАТЬ 3

Вот, пожалуй, лучшая идея, возможно, попытаться использовать целевой растровый контекст, который использует блок CFData, который является CFData с отображением в памяти. Это работает? Опять же, делайте это только в том случае, если вы довольны данными, проходящими через временный файл.

РЕДАКТИРОВАТЬ 4

О нет, похоже, что отображенные в память данные чтения-записи недоступны. Может быть, попробуйте mmap BSD API.

РЕДАКТИРОВАТЬ 5

Добавлены комментарии "const char *" и "пиксели только для чтения" к коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...