Android транслирует несколько растровых плиток в один файл JPEG - PullRequest
3 голосов
/ 01 марта 2012

Я занимаюсь разработкой приложения для работы с изображениями, которое должно работать с большими изображениями, например, изображениями, снятыми камерой. Я использую подход, заключающийся в том, чтобы разделить исходное изображение на несколько плиток подходящего размера, чтобы плитки моглизагружается отдельно в память в виде растрового изображения без превышения страшного предела виртуальной машины, следующая манипуляция с изображением выполняется для каждого элемента мозаичным образом, это все хорошо, но пока я не хочу сшить эти элементы обратно в конечное изображение JPEG.
Я ищу встроенное решение SDK API или бесплатное программное обеспечение, которое может выполнять следующие действия:

Открыть выходной файл JPEG в качестве выходного потока Поток пикселей RGB из растрового изображения(фрагмент 1) в выходной поток JPEG Поток пикселей RGB из растрового изображения (фрагмент 2) в выходной поток JPEG и т. д. для всех плиток Закрыть выходной поток JPEG

Любые идеи или указатели, кроме написания моего собственного jpeg-кодировщика?

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

Ваш подход сшивания имеет две основные проблемы и в конечном итоге потерпит неудачу. Если вы попросите систему декодировать файл JPEG по частям, время декодирования окажется в N раз больше (N = количество частей). Следующая проблема заключается в том, что при попытке сохранить изображение у вас не хватит памяти. Изображения JPEG должны быть сжаты в одном кадре. Если все ваше несжатое изображение не помещается в памяти, вы не сможете использовать технику, которую используете.

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

0 голосов
/ 01 марта 2012

Как насчет этого:

FileOutputStream outFile = new FileOutputStream(output_file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outFile);
outFile.flush();
outFile.close();

Вы можете отрегулировать настройку качества (100).См. документы

Вам все равно нужно решить, как его нарезать.Но если вы берете изображение на устройство, с какой стати возникнет проблема с загрузкой всего изображения, если оно не вызвало проблемы с памятью?

Сшивание плиток обратно вместе : Вот один простой подход, используемый в скользких картах, который, я знаю, работает.

  1. Вырезать плитки стандартного размера (скажем, 256x256)
  2. Назначить каждой плитке значение x, y - этоЭто может быть структура каталогов или соглашение о именах файлов: например, «0_0.jpg»
  3. Имена плиток (номера) связаны с их положением в верхнем / левом пикселях.

Каждый номер плитки можно рассчитать следующим образом:

tileX = floor(pixelX / 256)

tileY = floor(pixelY / 256)

Таким образом, плитка в пикселях 0,0 = плитка (0,0), плитка в пикселях 256,0 - это плитка (1,0) и т. Д. *

...