Ключ никогда не будет полностью декодировать все изображение в память в полном размере.
Если вам нужно отобразить изображение, нет причин делать это в полном размере - дисплей на iPhone слишком мал, чтобы воспользоваться этим. Для объектов изображения, предназначенных для отображения, декодируйте изображение в уменьшенном виде.
Для обработки вам потребуется написать собственный код, который работает с потоком пикселей, а не с массивом в памяти. Я не знаю, доступно ли это уже на iPhone, но вы можете написать это самостоятельно, написав напрямую в API библиотеки libpng.
Например, ваш код сейчас, вероятно, выглядит примерно так (псевдокод)
img = ReadImageFromFile("image.png")
img2 = RotateImage(img, 90)
SaveImage(img2, "image2.png")
Главное, что нужно понять, это то, что в данном случае img
- это не данные в файле PNG (2 МБ), а полностью несжатое изображение (~ 6 МБ). RotateImage (или как он там называется) возвращает другое изображение примерно такого же размера. Если вы увеличиваете масштаб, это еще хуже.
Вы хотите, чтобы код выглядел более похожим на это (но, возможно, для этого не было бы никаких API-интерфейсов - вам, возможно, придется написать его самостоятельно)
imgPixelGetter = PixelDecoderFromFile("image.png")
imgPixelSaver = OpenImageForAppending("image2.png")
w = imgPixelGetter.Width
h = imgPixelGetter.Height
// set up a 90 degree rotate
imgPixelSaver.Width = h
imgPixelSaver.Height = w
// read each vertical scanline of pixels
for (x = 0; x < w; ++x) {
pixelRect = imgPixelGetter.ReadRect(x, 0, 1, h) // x, y, w, h
pixelRect.Rotate(90); // it's now got a width of h and a height of 1
imgPixelSaver.AppendScanLine(pixelRect)
}
В этом алгоритме у вас никогда не было всего изображения в памяти сразу - вы читали его по частям и сохраняли его. Вы можете написать аналогичные алгоритмы для масштабирования и обрезки.
Компромисс в том, что он будет медленнее, чем просто декодирование его в память - это зависит от формата изображения и кода, который выполняет ReadRect (). К сожалению, PNG не предназначен для такого вида доступа к пикселям.