Можно ли сделать UIImage с меньшим объемом памяти? - PullRequest
0 голосов
/ 02 октября 2009

У меня есть UIImage, который заполняется изображением, поступающим с камеры iPhone.

Поскольку изображение имеет размер 2048x1536 пикселей, оно занимает большой объем памяти.

  1. Я надеюсь, что это изображение 24, а не 32 бита, но я не уверен. Итак, это первый вопрос. Изображение с камеры iPhone 24 или 32 бита?
  2. Второй вопрос: если изображение 32-битное, как я могу сделать его 24-битным в той же памяти?
  3. Третий вопрос: могу ли я что-нибудь сделать с этим изображением, БЕЗ ИЗМЕНЕНИЯ ЕГО РАЗМЕРА , прежде чем присвоить его переменной для экономии места?

Нет решения, связанного с OpenGL, пожалуйста.

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

Ответы [ 2 ]

1 голос
/ 02 октября 2009

Не так уж много вы можете сделать, не имея этого изображения в памяти и не создавая второй буфер для хранения измененной версии. Я считаю, что второй буфер может содержать меньше битов на цвет и даже пропустить альфа-значение. Если вы выберете 4 бита на цвет, вы сможете сэкономить 50% от оригинала, и это не включает экономию, если вы избавитесь от альфа.

Набор простых вызовов скажет вам, что представляет собой информация на картинке, например, биты на цвет и содержит ли она альфа:

CGImageAlphaInfo CGImageGetAlphaInfo (
   CGImageRef image
);

Возвращаемое значение Константа CGImageAlphaInfo, которая указывает (1), содержит ли растровое изображение альфа-канал, (2) где альфа-биты расположены в данных изображения и (3) предварительно умножено значение альфа. Возможные значения см. В разделе «Константы». Функция возвращает kCGImageAlphaNone, если параметр изображения ссылается на маску изображения.

size_t CGImageGetBitsPerComponent (
   CGImageRef image
);

Возвращаемое значение Количество битов, используемых в памяти для каждого компонента цвета указанного растрового изображения (или маски изображения). Возможные значения: 1, 2, 4 или 8. Например, для 16-битного цветового пространства RGB (A) функция будет возвращать значение 4 бита на компонент цвета.

size_t CGImageGetBitsPerPixel (
   CGImageRef image
);

Возвращаемое значение Количество битов, используемых в памяти для каждого пикселя указанного растрового изображения (или маски изображения).

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

0 голосов
/ 02 октября 2009

(на самом деле это не ответ, а скорее наблюдение)

Исходные данные для изображения такого размера занимают около 12 МБ свободного пространства без сжатия.

2048 * 1536 = 3 145 728 пикселей.

Для каждого пикселя требуется 1 байт данных красного цвета, 1 байт данных зеленого цвета, 1 байт данных синего цвета и 1 байт прозрачности = 4 байта / пиксель.

3145728 * 4 = 12 582 912 байт = ровно 12 МБ.

Для iPhone это действительно большой кусок памяти, и я сомневаюсь, что вы могли бы многое сделать, чтобы обойти это (исключая чтение только сегментов изображения за раз с диска, но в зависимости от вашего варианта использования) , это может действительно убить батарею).

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