Маскировка файлов изображений в Java - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть ситуация, когда я хотел бы сделать очень легкую обфутизацию файлов изображений. Мое приложение поставляется с кучей файлов .png, и мне бы хотелось, чтобы они не были так легко редактируемыми.

Я не ищу «безопасного» решения (я не думаю, что оно действительно существует), я просто хотел бы, чтобы Joe Public не смог отредактировать файлы.

Я сейчас использую;

ImageIO.read(new File("/images/imagefile.png"));

Я бы предпочел не использовать сериализацию, так как система ImageIO глубоко укоренилась в коде, каждое изображение также должно оставаться в виде отдельного файла на диске.

Я надеялся, что смогу просто изменить расширение файла, например;

ImageIO.read(new File("/images/imagefile.dat"));

Но ImageIO, похоже, использует его для идентификации файла. Могу ли я сказать ImageIO, что это PNG, несмотря на его расширение?

Ответы [ 4 ]

3 голосов
/ 29 февраля 2012

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

1 голос
/ 29 февраля 2012

Ввод / вывод изображения Java использует Интерфейс поставщика услуг для поддержки новых форматов изображения 1 .Я полагаю, что возможно добавить новый декодер, используя расширение файла.Если это так, есть способ предоставить легко подключаемый считыватель для пользовательского формата изображения.

Обратите внимание, что вам, вероятно, потребуется изменить расширение файла в источнике.Это может быть работа для расширенной IDE или одноразовый поиск и замена с использованием grep.

Что касается формата, один из чрезвычайно простых способов сделать мультимедийные файлы нечитаемыми для обычных читателей - записать байтыизображение в обратном порядке.Затем переверните их обратно после прочтения, поместите их в ByteArrayInputStream и передайте их ImageIO.read(InputStream).

  1. После того, как вы написали сервис-провайдеру и Jar'd его правильно (используя манифест сатрибуты, чтобы идентифицировать файл / тип контента, который он обрабатывает, и соответствующий кодер / декодер), добавить его в путь к классам времени выполнения приложения, и он должен иметь возможность считывать пользовательский формат изображения.
0 голосов
/ 29 февраля 2012

Вы можете попробовать это:

Iterator rs = ImageIO.getImageReadersByFormatName("png");
ImageReader ir = (ImageReader) rs.next();
File srcFile = new File("/images/imagefile.dat");
ImageInputStream iis = ImageIO.createImageInputStream(srcFile);
ir.setInput(iis);
0 голосов
/ 29 февраля 2012

... или сохраните все изображения в одном файле и seek() в начальную позицию каждого изображения при загрузке.Вы можете сделать это путем предварительного поиска против FileInputStream или наоборот, создав ByteArrayInputStream для ImageIO.read(InputStream).

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