Почему мои байты заполнения битовой карты не синхронизированы, когда я уверен, что все должно быть в порядке? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь напечатать шестнадцатеричную строку в виде двоичных байтов в растровое изображение (по порядку), например: a6c832bac v 1010 v FFFFFF000000FFFFFF000000 (b, g, r) в пиксельном массиве.

проблема, я быПредположим, что с «отступом» я могу жить, просто распечатав это в массив пикселей, но, как и следовало ожидать, изображение должно быть черно-белым, но есть смещение, и мое изображение многоцветное...

Я попытался поискать, и я попытался возиться с последовательностью. Я новичок в Java, так что я не знаю, есть ли что-то, что мне не хватает. Я действительно не могу понять

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

int headers[] = new int[13];
        int WIDTH = (int)Math.sqrt(hexstring.length()*4) + 1;
        int HEIGHT = WIDTH;
        int extrabytes, paddedsize, offset;
        int bit = 0;
        extrabytes = 4 - ((WIDTH * 3) % 4);
        if(extrabytes == 4) extrabytes = 0;
        paddedsize = ((WIDTH * 3) + extrabytes) * HEIGHT;

Это код рисования массива пикселей.

        int z = 0;
        int x = 0;
        for (int yy = HEIGHT - 1; yy >= 0; yy--) {     // BMP PIXEL ARRAY, Bottom -> Top, Left -> Right
            for (int xx = 0; xx <= WIDTH - 1; xx++) {
                if(z < hexstring.length()){ // print valuable chars
                    String bit_string = String.format("%4s", Integer.toBinaryString(Integer.parseInt(Character.toString(hexstring.charAt(z)), 16))).replace(" ", "0");
                    byte[] bits = bit_string.getBytes();
                    System.out.println("BIT STRING: " + bit_string);
                    for(int w = 0; w < 4; w++){
                    bit = (bits[w]-48)*0xFF;
                    System.out.println(bit);
                    outfile.write(bit);
                    outfile.write(bit);
                    outfile.write(bit);
                    }
                    z++;
                } else { //print eot
                    outfile.write(128);
                    outfile.write(128);
                    outfile.write(128);
                }
            }
            if (extrabytes != 0) {     
                for (int nnn = 1; nnn <= extrabytes; nnn++)
                {
                    System.out.println("PADDING");
                    outfile.write(0);   // can be any value
                }
            }
        }

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

BIT STRING: 0110
0
255
255
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 1011
255
0
255
255
BIT STRING: 0011
0
0
255
255
BIT STRING: 1010
255
0
255
0
BIT STRING: 1111
255
255
255
255
BIT STRING: 1001
255
0
0
255
BIT STRING: 0011
0
0
255
255
BIT STRING: 1011
255
0
255
255
BIT STRING: 1110
255
255
255
0
BIT STRING: 0001
0
0
0
255
BIT STRING: 1010
255
0
255
0
BIT STRING: 1110
255
255
255
0
BIT STRING: 0100
0
255
0
0
BIT STRING: 0010
0
0
255
0
BIT STRING: 1110
255
255
255
0
BIT STRING: 0010
0
0
255
0
PADDING
PADDING
BIT STRING: 1000
255
0
0
0
BIT STRING: 1111
255
255
255
255
BIT STRING: 0100
0
255
0
0
BIT STRING: 0010
0
0
255
0
BIT STRING: 1111
255
255
255
255
BIT STRING: 0011
0
0
255
255
BIT STRING: 1100
255
255
0
0
BIT STRING: 0110
0
255
255
0
BIT STRING: 1101
255
255
0
255
BIT STRING: 1101
255
255
0
255
BIT STRING: 0001
0
0
0
255
BIT STRING: 1000
255
0
0
0
BIT STRING: 1101
255
255
0
255
BIT STRING: 0010
0
0
255
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 0010
0
0
255
0
BIT STRING: 0111
0
255
255
255
BIT STRING: 1010
255
0
255
0
PADDING
PADDING
BIT STRING: 0010
0
0
255
0
BIT STRING: 0001
0
0
0
255
BIT STRING: 1010
255
0
255
0
BIT STRING: 1010
255
0
255
0
BIT STRING: 1010
255
0
255
0
BIT STRING: 0111
0
255
255
255
BIT STRING: 1000
255
0
0
0
BIT STRING: 0000
0
0
0
0
BIT STRING: 0110
0
255
255
0
BIT STRING: 0110
0
255
255
0
BIT STRING: 0110
0
255
255
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 1111
255
255
255
255
BIT STRING: 0000
0
0
0
0
BIT STRING: 1010
255
0
255
0
BIT STRING: 0101
0
255
0
255
BIT STRING: 1110
255
255
255
0
BIT STRING: 0010
0
0
255
0
PADDING
PADDING
BIT STRING: 1010
255
0
255
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 1100
255
255
0
0
BIT STRING: 0111
0
255
255
255
BIT STRING: 1100
255
255
0
0
BIT STRING: 1100
255
255
0
0
BIT STRING: 1010
255
0
255
0
BIT STRING: 0011
0
0
255
255
BIT STRING: 0101
0
255
0
255
BIT STRING: 0111
0
255
255
255
BIT STRING: 1110
255
255
255
0
BIT STRING: 0010
0
0
255
0
BIT STRING: 0000
0
0
0
0
BIT STRING: 1000
255
0
0
0
BIT STRING: 0001
0
0
0
255
BIT STRING: 1001
255
0
0
255
BIT STRING: 1000
255
0
0
0
BIT STRING: 0001
0
0
0
255
PADDING
PADDING
BIT STRING: 1111
255
255
255
255
BIT STRING: 0111
0
255
255
255
BIT STRING: 0001
0
0
0
255
BIT STRING: 0100
0
255
0
0
BIT STRING: 0001
0
0
0
255
BIT STRING: 0011
0
0
255
255
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
PADDING
EXTRA BYTES = 2
78 characters printed out of 78

1 Ответ

0 голосов
/ 10 ноября 2019

Ответ был полусложным, но, видимо, проблема была в этом.

for(int w = 0; w < 4; w++){
    bit = (bits[w]-48)*0xFF;
    System.out.println(bit);
    outfile.write(bit);
    outfile.write(bit);
    outfile.write(bit);
    }

    ```
    for some reason writing to the file in this loop just was unpredictable, and i ended up just converting my large hexadecimal string to a full binary string byte by byte
...