2012-02-08 1 views
2

Я пишу класс для печати растровых изображений на портативный принтер bluetooth на Android через Mono для 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:

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

+0

Вы ищете алгоритм обмена числами в матрице, пиксели изображения, поэтому изображение повернуто? Что вы подразумеваете под 'flip' – Adrian

+0

@Adrian Да, мне нужно изменить массив, чтобы изображение было напечатано в правильной ориентации. Я ищу алгоритм, который будет выполнять команду «flip vertical» в Photoshop или других программах рисования. – dmck

+0

Является ли формат таким, чтобы бит-бит содержал биты 'width * height * bits_per_pixel'? И если да, то он организован в форме '[first_row | second_row | ...]'? –

ответ

2

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

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

Для формата с 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

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

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]; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^