Аннотация:
- чтение изображений из файла
- с переключенными битами, чтобы сделать непригодным для инструментов предварительного просмотра
- не может использовать шифрование, так как требуется много энергии
- Могу ли я либо оптимизировать код ниже, или есть лучший подход
Более подробное описание:
Я пытаюсь улучшить свой код, может быть, у вас есть идеи или улучшения для следующей ситуации. Пожалуйста, имейте в виду, что я не пытаюсь победить ЦРУ и не беспокоюсь, если кто-то «затормозит» шифрование.
Фон прост: мое приложение загружает кучу изображений с сервера в папку на SD-карте. Я НЕ хочу, чтобы изображения были простыми файлами JPG , потому что в этом случае индексатор мультимедиа занесет их в библиотеку, и пользователь может просто скопировать всю папку на свой жесткий диск.
Очевидный путь - шифрование. Но полноценное шифрование AES или другое шифрование не имеет смысла по двум причинам: мне пришлось бы хранить пароль в приложении, чтобы любой мог получить ключ в любом случае. И цена дешифрования изображений на лету слишком высока (речь идет, например, о галерее с 30 изображениями по 200 КБ).
Поэтому я решил переключить некоторые биты в изображении . Это делает формат нечитаемым для инструментов изображения (или превью), но довольно легко отменяется при чтении изображений. Для «шифрования» я использую какой-то инструмент C #, строки «расшифровывать» следующие:
public class CustomInputStream extends InputStream {
private String _fileName;
private BufferedInputStream _stream;
public CustomInputStream(String fileName) {
_fileName = fileName;
}
public void Open() throws IOException {
int len = (int) new File(_fileName).length();
_stream = new BufferedInputStream(new FileInputStream(_fileName), len);
}
@Override
public int read() throws IOException {
int value = _stream.read() ^ (1 << 7);
return value;
}
@Override
public void close() throws IOException {
_stream.close();
}
}
Я также пытался перезаписать другие методы (прочитанные более чем одним байтом), но это убивает BitmapFactory - не уверен почему, может быть, я сделал что-то не так. Вот код для создания растрового изображения:
Bitmap bitmap = null;
try {
InputStream i = CryptoProvider.GetInstance().GetDecoderStream(path);
bitmap = BitmapFactory.decodeStream(i);
i.close();
} catch (Exception e1) {
_logger.Error("Cant load image " + path + " ERROR " + e1);
}
if (bitmap == null) {
_logger.Error("Image is NULL for path " + path);
}
return bitmap;
Есть ли у вас какие-либо отзывы о выбранном подходе? Любой способ оптимизировать его или совершенно другой подход для устройств Android?