Алгоритм вертикального отражения растрового изображения в байтовом массиве - PullRequest
2 голосов
/ 08 февраля 2012

Я пишу класс для печати растровых изображений на портативный принтер Bluetooth в Android через Mono For Android. Мой класс используется для получения пиксельных данных из потока, чтобы их можно было отправлять на принтер в правильном формате. Прямо сейчас класс прост, он просто читает высоту, ширину и биты на пиксель.

Используя смещение, он считывает и возвращает данные пикселей в принтер. Сейчас я работаю с черно-белыми изображениями на 1 бит на пиксель. Растровые изображения, с которыми я работаю, имеют формат Windows.

Вот оригинальное изображение:

Original Image (Sent as Bitmap)

Result of printing and initial attempt at flip

Вот результат печати, первое изображение без каких-либо преобразований. И второй результат является результатом изменения BitArray с помощью следующего кода:

        BitArray bits = new BitArray(returnBytes);
        BitArray flippedBits = new BitArray(bits);

        for (int i = 0, j = bits.Length - 1; i < bits.Length; i++, j--)
        {
            flippedBits[i] = bits[j];
        }

Мой вопрос:

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

Edit:

Мое растровое изображение сохраняется в одномерном массиве с байтами первых строк, затем вторым, третьим и т. Д.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Вам нужно сделать что-то вроде этого:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0; i < bits.Length; i += width) {
    for (int j = 0, k = width - 1; j < width; ++j, --k) {
        flippedBits[i + j] = bits[i + k];
    }
}

Если вам нужно отразить картинку вверх ногами, используйте этот код:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0, j = bits.Length - width; i < bits.Length; i += width, j -= width) {
    for (int k = 0; k < width; ++k) {
        flippedBits[i + k] = bits[j + k];
    }
}
2 голосов
/ 08 февраля 2012

Для формата с width*height битами в порядке строк, вам просто нужно просмотреть массив битов как двумерный массив.

for(int row = 0; row < height; ++row) {
    for(int column = 0; column < width; ++column) {
        flippedBits[row*width + column] = bits[row*width + (width-1 - column)];
    }
}

Было бы немного сложнее, если бы было большечем один бит на пиксель.

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

Вам нужно использовать два цикла, первый для итерации по всем строкам, а второй для итерации пикселей внутри каждой строки.

for (int y = 0;  y < height;  y++)
{
    int row_start = (width/8) * y;
    int flipped_row = (width/8) * (height-1 - y);
    for (int x = 0;  x < width/8;  x++)
    {
        flippedBits[flipped_row+x] = bits[row_start+x];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...