垂直翻转字节数组中位图的算法

我正在通过Mono For Android为Android中的便携式蓝牙打印机编写一个用于打印位图的课程。 我的类用于从流中获取像素数据,以便可以以正确的格式将其发送到打印机。 现在这个类很简单,它只读取每个像素的高度,宽度和位数。

使用它读取的偏移量并将像素数据返回给打印机。 现在我只使用每像素1位黑白图像。 我正在使用的位图是Windows格式。

这是原始图像:

原始图像(作为位图发送)

打印结果和初始尝试翻转

这是打印的结果,第一张图片没有任何变换。 第二个是使用以下代码修改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]; } 

我的问题是:

当我使用字节数组时,如何垂直翻转图像。 我无法找到执行此操作的算法,所有示例似乎都建议使用我无法使用的已建立的图形库。

编辑:

我的位图保存在一维数组中,第一行是字节,第二行是第三,等等。

你需要做这样的事情:

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

对于按行顺序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)]; } } 

如果每个像素有多个位,那将会更复杂一些。

您需要使用两个循环,第一个迭代所有行,第二个迭代每行内的像素。

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