Я думаю, что лучшее, что вы можете сделать с этими требованиями, - это сжать все PNG в памяти (примерно 1 ГБ, как вы указали) и распаковывать только один раз, когда вы хотите получить из него пиксели. Размер буфера распакованного 8-битного изображения в градациях серого 512x512 составляет 256 КБ. Если изображения RGB, то размер составляет 768 КБ. Если у вас также есть альфа-канал, то размер будет 1 МБ.
Вы можете найти очень легкую и простую библиотеку, которая распаковывает PNG здесь .
Если вы хотите скрыть тот факт, что изображения сжимаются в памяти, вы можете поместить сжатые данные PNG в класс изображений. Метод getPixel(x, y)
в этом классе вызовет распаковку, если изображение сжато. Члены класса в этом классе могут отслеживать, какое изображение было распаковано, и когда другое изображение необходимо распаковать, предыдущее может сбросить его распакованный буфер.
Единственная проблема, с которой вы можете столкнуться при таком решении, состоит в том, что система может thrash , если вы перебираете свои 100K-изображения, запрашивая только один пиксель, а затем переходите к следующему пикселю. Чтобы избежать этого, вам нужно будет получить всю необходимую информацию из одного изображения, а затем перейти к следующему изображению.