В настоящее время я работаю над инструментом для преобразования изображения в двоичную строку и наоборот.
Чтобы преобразовать изображение в двоичный файл, я использую следующий метод:
public void toText(String imagePath, String textPath) throws IOException {
BufferedImage image = ImageIO.read(new File(imagePath));
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
ImageIO.write(image, "png", byteStream);
byte[] bytes = byteStream.toByteArray();
PrintWriter writer = new PrintWriter(new File(textPath));
StringBuilder sb = new StringBuilder();
for(byte b : bytes) {
sb.append(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0'));
}
writer.write(sb.toString());
writer.close();
}
Вывод в файл .txt будет выглядеть следующим образом: "10001001010100000100111001000111000011010000101000011010000..."
Я считаю, что этот код должен работать нормально, пожалуйста, исправьте меня, если я ошибаюсь!
Теперь я хочу преобразовать строку обратно вкартинка. Для этого я написал следующий код:
public void toImage(String imagePath, String textPath) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File(textPath)));
String binary = reader.readLine();
reader.close();
byte[] bytes = new byte[binary.length() / 8];
for(int i = 0; i < bytes.length; i++) {
bytes[i] = Byte.parseByte((String) binary.subSequence(i * 8, i * 8 + 8), 2);
}
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
ImageIO.write(image, "png", new File(imagePath));
}
Проблема этого кода в том, что "10001001"
, например, больше, чем максимальный размер byte
(137
). Это потому, что "10001001"
должен фактически переводиться в значение -119
, используя представление дополнения 2.
Как я могу решить эту проблему? Как узнать, когда использовать «нормальное» двоичное представление, а когда использовать дополнение 2?
Спасибо.