Java: Как преобразовать двоичную строку в изображение? - PullRequest
1 голос
/ 20 октября 2019

В настоящее время я работаю над инструментом для преобразования изображения в двоичную строку и наоборот.

Чтобы преобразовать изображение в двоичный файл, я использую следующий метод:

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?

Спасибо.

1 Ответ

1 голос
/ 20 октября 2019

Вам нужен флаг, который говорит вам об этом.

A 0 для номеров, где вам не нужно дополнение.

A 1 для номеров, где вы делаете.

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

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